原文链接 >> 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
1
maocat 2021-04-19 15:25:20 +08:00
反射还是少用
|
2
qW7bo2FbzbC0 2021-04-19 16:18:10 +08:00
熟悉的味道,还是 python 的君子协定好点
|