文章首发公众号:newbmiao
Dig101: dig more, simplified more and know more
我们都知道Go
的struct
里,小写字段是非导出的,即不可从包外部访问。
但非导出字段在外部也并不是没有办法访问,也不是不可以修改。
今天看下reflect
包如何在包外操作非导出字段。
取地址访问
先来看第一个函数NewAt
:
对于结构体,通过其底层地址(指针p)和类型,返回指向该结构体的一个指针,
该值是可寻址的(addressable
),即可访问该结构体
// reflect/value.go
// NewAt returns a Value representing a pointer to a value of the
// specified type, using p as that pointer.
func NewAt(typ Type, p unsafe.Pointer) Value {
fl := flag(Ptr)
t := typ.(*rtype)
return Value{
t.ptrTo(), p, fl}
}
有个这个方法,就可以通过struct
的反射获取非导出字段
比如访问,对于如下含有非导出字段的结构体Example