【问题标题】:Golang variable struct fieldGolang 变量结构体字段
【发布时间】:2016-07-11 06:05:29
【问题描述】:

这可能需要反思,但我不确定。我正在尝试遍历结构中的一组必填字段。如果这些字段中的任何一个为零,我想基本上抛出一个错误。我已经掌握了基本形式,但我意识到我不知道如何在 Go 中通过变量传递结构字段名称

假设您有一个名为 EmailTemplate 的结构,它有一个名为 template_id 的字段

在这种情况下,我想知道 EmailTemplate.TemplateId 是否为 nil

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

【问题讨论】:

    标签: go


    【解决方案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/

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 2022-12-19
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多