这可能需要反思,但我不确定。我试图循环结构中的必需字段数组。如果这些字段中的任何一个为零,我想基本上抛出一个错误。我已经得到了基本的表格,但我意识到我不知道Go如何通过变量传递结构字段名称
假设您有一个名为EmailTemplate的结构,它有一个名为template_id
的字段在这种情况下,我想知道EmailTemplate.TemplateId是否为零
emailDef.Fields是一个字符串数组[“TemplateId”]
我想检查这些字段是否在EmailTemplate结构中,如果它们是nil
for field := range emailDef.Fields {
fmt.Println(emailDef.Fields[field])
if EmailTemplate.[emailDef.Fields[field]] == nil {
missingField := true
}
}
符合我的想法,但我知道这是错误的,因为结构不是数组。 emailDef.Fields [field]等同于TemplateId
答案 0 :(得分:1)
你的循环内容对我来说并没有多大意义所以我将给出一个名为field
的字符串中的单个字段的一般示例。如果您要检查一个切片或一组字段,那么您需要使用field
的当前值来覆盖该字段。
import "reflect"
st := reflect.TypeOf(EmailTemplate)
v, ok := st.FieldByName(field)
if ok {
// field existed on EmailTemplate, now check if it's nil
if v.IsNil() {
// the field field on instance EmailTemplate was nil, do something
}
}
现在假设你有一个你需要检查的字段列表都是非零的,那么只需添加一个这样的循环;
for field := range requiredFields {
st := reflect.TypeOf(EmailTemplate)
v, ok := st.FieldByName(field)
if ok {
// field existed on EmailTemplate, now check if it's nil
if v.IsNil() {
// the field field on instance EmailTemplate was nil, do something
// maybe raise error since the field was nil
} else {
//the field wasn't found at all, probably time to raise an error
}
}
}
反映包文档在这里; https://golang.org/pkg/reflect/