V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
a719114136

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

  •  
  •   a719114136 ·
    gojuukaze · Apr 19, 2021 · 1770 views
    This topic created in 1846 days ago, the information mentioned may be changed or developed.

    原文链接 >> 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
    
    2 replies    2021-04-19 16:18:10 +08:00
    maocat
        1
    maocat  
       Apr 19, 2021
    反射还是少用
    qW7bo2FbzbC0
        2
    qW7bo2FbzbC0  
       Apr 19, 2021
    熟悉的味道,还是 python 的君子协定好点
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1408 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 17:13 · PVG 01:13 · LAX 10:13 · JFK 13:13
    ♥ Do have faith in what you're doing.