gpt4 book ai didi

go - 遍历具有嵌入结构的结构

转载 作者:行者123 更新时间:2023-12-01 22:24:58 25 4
gpt4 key购买 nike

我有几个正在接收数据的结构。所有结构都应包含一些相同的数据,这些数据已嵌入 HeaderData结构。数据不是同时填充的,我需要一个函数来检查所有字段是否都收到了一个值(不是空字符串)。

我试图用反射解决这个问题。问题是反射会考虑 HeaderData成为一个领域。这意味着它将始终是一个非空字符串,尽管它可能包含空字段。所以我相信我需要一种方法来单独检查该结构。

我尝试使用 anyStruct.HeaderData 访问它,但这不起作用,因为“{} 是没有方法的接口(interface)”。

有没有其他方法可以访问HeaderData这样可以吗?

或者我可以在 dataReady 中以某种方式指定吗?输入必须具有字段 HeaderData ?

package main

import (
"fmt"
"reflect"
)

type HeaderData struct {
Param1 string
Param2 string
}

type Data1 struct {
HeaderData
Param3 string
Param4 string
}

type Data2 struct {
HeaderData
Param3 string
Param5 string
}

func dataReady(anyStruct interface{}) bool {
v := reflect.ValueOf(anyStruct)
for i := 0; i < v.NumField(); i++ {
// fmt.Println(v.Field(i).Interface())
if v.Field(i).Interface() == "" {
return false
}
}


// v1 := reflect.ValueOf(anyStruct.HeaderData)
// Not working:
// anyStruct.HeaderData undefined (type interface {} is interface with no methods)

return true
}

func main() {
d1 := Data1{HeaderData: HeaderData{Param1: "ABC", Param2: "DEF"}, Param3: "GHI", Param4: "JKL"}
d2 := Data2{HeaderData: HeaderData{Param1: "ABC", Param2: "DEF"}}
d3 := Data2{HeaderData: HeaderData{Param1: "ABC"}, Param3: "GHI", Param5: "JKL"}
d4 := Data2{Param3: "GHI", Param5: "JKL"}
fmt.Println("d1Ready: ", dataReady(d1)) //Returns true, which is correct
fmt.Println("d2Ready: ", dataReady(d2)) //Returns false, which is correct
fmt.Println("d3Ready: ", dataReady(d3)) //Returns true but should return false
fmt.Println("d4Ready: ", dataReady(d4)) //Returns true but should return false
}

Playground

最佳答案

也许尝试一个小界面来做同样的事情,我认为这会更具可读性。

https://play.golang.org/p/H4lh91RMd6C

package main

import (
"fmt"
)

type(

FieldCheck interface {
Check() (b bool)
}

HeaderData struct {
Param1 string
Param2 string
}

Data1 struct {
HeaderData
Param3 string
Param4 string
}

Data2 struct {
HeaderData
Param3 string
Param5 string
}
)

func(h *HeaderData) Check() (b bool) {
if h.Param1 == "" || h.Param2 == "" {
return false
}
return true
}

func(d *Data1) Check() (b bool) {
if (d.Param3 == "" || d.Param4 == "" || ! d.HeaderData.Check()) {
return false
}
return true
}

func(d *Data2) Check() (b bool) {
if (d.Param3 == "" || d.Param5 == "" || ! d.HeaderData.Check()) {
return false
}
return true
}


func main() {

d := []FieldCheck{
&Data1{HeaderData: HeaderData{Param1: "ABC", Param2: "DEF"}, Param3:
"GHI", Param4: "JKL"},
&Data2{HeaderData: HeaderData{Param1: "ABC", Param2: "DEF"}},
&Data2{HeaderData: HeaderData{Param1: "ABC"}, Param3: "GHI", Param5:
"JKL"},
&Data2{Param3: "GHI", Param5: "JKL"},
}

for _, num := range d {
fmt.Println(num.Check())
}
}

关于go - 遍历具有嵌入结构的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60544730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com