我有一个像这个演示这样的数据结构。
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) } }
当我不为家庭使用Point时,它会返回“ bari”并且没关系。但是有了point,就会出现此错误。
反射:在ptr值上调用reflect.Value.FieldByName
我进行了很多搜索,但找不到答案可以提供帮助。
您已经注意到,family是*Family。正如错误所言,您不能在该值是指针.FieldByName(...)的reflect.Value地方调用。
family
*Family
.FieldByName(...)
reflect.Value
相反,您需要间接指针,以获取其指向的值,然后对其进行调用.FieldByName(...)。
familyPtr := v.FieldByName("family") v = reflect.Indirect(familyPtr).FieldByName("last")
请参阅有关间接文档:https://golang.org/pkg/reflect/#Indirect