我正在递归地抓取一个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
}
答案 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
无效。