首页  >  文章  >  后端开发  >  如何在 Go 中使用“reflect.Value.FieldByName()”访问结构体指针中的字段?

如何在 Go 中使用“reflect.Value.FieldByName()”访问结构体指针中的字段?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-08 11:49:02170浏览

How to Access Fields in a Struct Pointer using `reflect.Value.FieldByName()` in Go?

在指针值上调用 `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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn