I have a data structure like this demo.
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)
}
and the code:
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)
}
}
when i do not use point for Family , it back "bari" and it is ok.But with point , there is this error .
reflect: call of reflect.Value.FieldByName on ptr Value
I searched a lot but i can not find answer can help.
As you've noted, family
is *Family
. And as the error says, you cannot call .FieldByName(...)
on a reflect.Value
where that value is a pointer.
Instead you need to indirect the pointer, to get the value that it points to, and call .FieldByName(...)
on that.
familyPtr := v.FieldByName("family")
v = reflect.Indirect(familyPtr).FieldByName("last")
See docs on indirect: https://golang.org/pkg/reflect/#Indirect
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With