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

分类: go

2021-04-19

|

245

|

评论:0

分享:

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


Powered by Froala Editor

Powered by Froala Editor



转载请注明来源

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

链接:/article/63

作者:gojuukaze

标签: golang 反射
本文共 0 个回复

发表评论 (对文章评论)

captcha