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

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

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地方调用。

相反,您需要间接指针,以获取其指向的值,然后对其进行调用.FieldByName(...)

familyPtr := v.FieldByName("family")

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

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

以上是 反射:在ptr值上调用reflect.Value.FieldByName 的全部内容, 来源链接: utcz.com/qa/423706.html

回到顶部