Go获取结构体未导出(私有)变量

gojuukaze · · 3079 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

> ##### 原文链接 >> [ Go获取结构体未导出(私有)变量www.ikaze.cn](https://www.ikaze.cn/article/63) | Go语音通过首字符的大小写来限制变量、函数的包外可见性。最近遇到个问题,需要访问一个官方包的未导出变量,发现可以通过反射获取,于是记录下来: 首选我们建个新的包 `user/user.go` ```go package user type User struct { id int Name string } func NewUser() User { return User{2, "gojuukaze"} } ``` 然后我们编写 `main.go` ,通过 `reflect.ValueOf` 输出user ```go func main(){ user:= user.NewUser() fmt.Println(user.Name) fmt.Println(reflect.ValueOf(user)) } ``` 程序的输出为: ``` gojuukaze {2 gojuukaze} ``` 可以看到``reflect.ValueOf``其实是能获取未导出的变量的。 ``reflect.ValueOf`` 返回的是结构体``Value`` ,接下来我们查看``Value`` 方法,可以看到一个 ``FieldByName`` 函数,从名字不难看出,它是通过字段名获取字段。 ---- 接下来尝试通过``FieldByName`` 获取变量。需要注意的是 ``FieldByName``返回的是``Value``类型,你可能需要经过类型装换后才能使用。 ```go func main(){ user:= user.NewUser() v:=reflect.ValueOf(user) fmt.Println(v.FieldByName("id")) fmt.Println(v.FieldByName("id").Int()) } ``` 程序输出为: ``` 2 2 ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3079 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传