如何使用Go中的反射将结构的nil指针设置为结构的零值?
我正在递归地爬行结构。它与如何使用Go中的反射将结构的nil指针设置为结构的零值?,go,reflection,struct,Go,Reflection,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)
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
}
var unmarshal func(s reflect.Value)错误
unmarshal=func(s reflect.Value)错误{
t:=s.Type()
对于i:=0;i
您可以使用reflect.New(f.Type.Elem())
创建指向零值的指针,然后使用v.Set(value)
进行设置。根据反映文件:
New返回一个值,该值表示指向指定类型的新零值的指针。也就是说,返回值的类型是PtrTo(typ)。
Go游乐场的完整示例如下:
请注意,我在if语句中也使用了
f.Type.Elem().Kind()
,而不是您的v.Elem().Kind()
,因为它要求Kind()
的nil
无效。否决投票的原因是什么?指针是一个结构字段吗?如果没有,struct字段在哪里?请在您的代码中显示更多上下文,以便我们了解您正在做什么。了解您试图解决的实际问题也会很好,这感觉像是一个问题,我明白了,术语被弄乱了。它似乎也是一个XY问题,所以如果您能够提供您试图实现的目标,那将是一件好事。请提供一个。