如何使用Go中的反射将结构的nil指针设置为struct的零值?

时间:2018-01-05 09:18:54

标签: go reflection struct

我正在递归地抓取一个struct。它与json包的功能相同。如果遇到指向结构的nil指针,则应将指针设置为结构的零值以便能够继续挖掘。我怎样才能做到这一点?

var unmarshal func(s reflect.Value) error
unmarshal = func(s reflect.Value) error {
    t := s.Type()
    for i := 0; i < s.NumField(); i++ {
        v := s.Field(i)
        f := t.Field(i)
        kind := v.Kind()
        if key, ok := f.Tag.Lookup("env"); ok {
            // ...
        } else if kind == reflect.Struct {
            unmarshal(v)
        } else if kind == reflect.Ptr && v.Elem().Kind() == reflect.Struct {
            if v.IsNil() {
                // Set pointer to zero value of struct.
            }
            unmarshal(v.Elem())
        }
    }
    return nil
}

1 个答案:

答案 0 :(得分:1)

您可以使用reflect.New(f.Type.Elem())创建指向零值的指针,然后使用v.Set(value)来设置它。根据反映文档:

New returns a Value representing a pointer to a new zero value for the specified type. That is, the returned Value's Type is PtrTo(typ).

Go Playground中的完整示例:

https://play.golang.org/p/b-034h3I-cn

请注意,我在if语句中使用了f.Type.Elem().Kind()而不是v.Elem().Kind(),因为它要求Kind() nil无效。