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

2021-04-19 15:15:16 +08:00
 a719114136

原文链接 >> Go 获取结构体未导出(私有)变量 www.ikaze.cn

|
Go 语音通过首字符的大小写来限制变量、函数的包外可见性。最近遇到个问题,需要访问一个官方包的未导出变量,发现可以通过反射获取,于是记录下来:

首选我们建个新的包 user/user.go

package user

type User struct {
	id   int
	Name string
}

func NewUser() User {
	return User{2, "gojuukaze"}
}

然后我们编写 main.go ,通过 reflect.ValueOf 输出 user

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类型,你可能需要经过类型装换有才能使用。

func main(){
	user:= user.NewUser()
	v:=reflect.ValueOf(user)
	fmt.Println(v.FieldByName("id"))
	fmt.Println(v.FieldByName("id").Int())
}

程序输出为:

2
2
1136 次点击
所在节点    Go 编程语言
2 条回复
maocat
2021-04-19 15:25:20 +08:00
反射还是少用
qW7bo2FbzbC0
2021-04-19 16:18:10 +08:00
熟悉的味道,还是 python 的君子协定好点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771672

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX