如何使用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问题,所以如果您能够提供您试图实现的目标,那将是一件好事。请提供一个。