首页 > 后端开发 > Golang > 如何在 Go 中使用反射访问指向结构体的字段?

如何在 Go 中使用反射访问指向结构体的字段?

Susan Sarandon
发布: 2024-11-08 04:36:02
原创
913 人浏览过

How to Access Fields of a Pointed Struct Using Reflection in Go?

处理 Reflect 中的指针值:解决“reflect:在 ptr Value 上调用reflect.Value.FieldByName”错误

在提供的代码中,您的数据结构定义的包含一个结构体 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")
登录后复制
  • familyPtr 检索 family 字段的 Reflect.Value。
  • Indirect(familyPtr) 取消引用指针,生成实际的 Family 值。
  • FieldByName("last") 然后从取消引用的 Family 值中检索“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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板