在提供的代码中,您的数据结构定义的包含一个结构体 Family,它作为指针存储在 Person 结构体中。当尝试使用 Reflect 包访问指向的 Family 中的字段时,您会遇到错误“reflect:在 ptr Value 上调用 Reflect.Value.FieldByName。”
理解错误
出现此错误是因为反射包的 FieldByName 函数需要非指针值作为其输入。当您使用指针 (*Family) 作为 FieldByName 的接收者时,该函数会尝试访问指针本身,而不是它指向的值。
解决问题
要解决此问题,您需要在访问字段之前间接指针。这可以使用 Reflect 包的 Indirect 函数来完成:
familyPtr := v.FieldByName("family") v = reflect.Indirect(familyPtr).FieldByName("last")
更新的代码
这是正确处理指针值的更新代码:
func Check(data interface{}) { var v = reflect.ValueOf(data) if v.Kind() == reflect.Struct { fmt.Println("was a struct") familyPtr := v.FieldByName("family") v = reflect.Indirect(familyPtr).FieldByName("last") fmt.Println(v) } }
以上是如何在 Go 中使用反射访问指向结构体的字段?的详细内容。更多信息请关注PHP中文网其他相关文章!