反映:在ptr值上调用reflect.Value.FieldByName

时间:2018-04-30 10:29:25

标签: go

我有一个像这个演示的数据结构。

type Family struct {
   first string
   last string
}
type Person struct {
   name string
   family *Family
}

func main(){
   per1 := Person{name:"niki",family:&Familys{first:"yam",last:"bari"}}
   Check(per1)
}

和代码:

var validate *validator.Validate
func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        v = v.FieldByName("family").FieldByName("last")
        fmt.Println(v)
    }
}

当我不使用积分为家庭时,它返回“bari”并且没关系。但是有点,有这个错误。

  

反映:在ptr值

上调用reflect.Value.FieldByName

我搜索了很多,但我找不到答案可以提供帮助。

1 个答案:

答案 0 :(得分:4)

如您所知,family*Family。如错误所示,您无法在.FieldByName(...)上调用reflect.Value,而该值是指针。

相反,您需要间接指针,以获取它指向的值,并在其上调用.FieldByName(...)

familyPtr := v.FieldByName("family")
v = reflect.Indirect(familyPtr).FieldByName("last")

请参阅有关间接的文档:https://golang.org/pkg/reflect/#Indirect