Golang变量struct字段

时间:2016-03-23 19:13:51

标签: go

这可能需要反思,但我不确定。我试图循环结构中的必需字段数组。如果这些字段中的任何一个为零,我想基本上抛出一个错误。我已经得到了基本的表格,但我意识到我不知道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

1 个答案:

答案 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/