在指针值上调用 `reflect.Value.FieldByName()
在 Go 中,当使用带有结构体指针的反射时,尝试调用 Reflect结构体指针值上的 .Value.FieldByName() 可能会导致以下错误:
reflect: call of reflect.Value.FieldByName on ptr Value
问题
当您尝试访问结构体的字段时会发生此错误表示为指针的值。考虑以下示例:
type Family struct { first string last string } type Person struct { name string family *Family // Pointer to Family struct } func Check(data interface{}) { v := reflect.ValueOf(data) if v.Kind() == reflect.Struct { v = v.FieldByName("family").FieldByName("last") } }
运行此代码时,会发生错误,因为 family 字段是指针。
解决方案
解决此问题问题,您需要使用 Reflect.Indirect() 取消引用指针值,以在访问字段之前获取实际的结构值:
v = reflect.Indirect(v.FieldByName("family")).FieldByName("last")
通过此修改,代码将正确访问 Family 的最后一个字段struct,无论 family 是值还是指针。
说明
reflect.Indirect() 返回指针指向的值。因此,在这种情况下,它返回 Family 结构体值,然后可以通过 FieldByName() 访问该值。
以上是如何在 Go 中使用“reflect.Value.FieldByName()”访问结构体指针中的字段?的详细内容。更多信息请关注PHP中文网其他相关文章!