> ##### 原文链接 >> [ 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
```
有疑问加站长微信联系(非本文作者)