Go 1.8 中有没有办法使用 Reflect 来访问未导出的字段?
这似乎不再有效:https://stackoverflow.com/a/17982725/555493
注意reflect.DeepEqual
工作得很好(也就是说,它可以访问未导出的字段),但我无法清楚地了解该函数。这是一个展示其实际操作的围棋游戏区:https://play.golang.org/p/vyEvay6eVG。 src代码如下
import (
"fmt"
"reflect"
)
type Foo struct {
private string
}
func main() {
x := Foo{"hello"}
y := Foo{"goodbye"}
z := Foo{"hello"}
fmt.Println(reflect.DeepEqual(x,y)) //false
fmt.Println(reflect.DeepEqual(x,z)) //true
}
如果该结构体是可寻址的,则可以使用unsafe.Pointer
访问该字段(读取or write)它,像这样:
rs := reflect.ValueOf(&MyStruct).Elem()
rf := rs.Field(n)
// rf can't be read or set.
rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()
// Now rf can be read and set.
请参阅操场上的完整示例。
这种使用unsafe.Pointer
根据以下规定有效文档和跑步go vet
没有返回任何错误。
如果该结构不可寻址,则此技巧将不起作用,但您可以创建一个可寻址副本,如下所示:
rs = reflect.ValueOf(MyStruct)
rs2 := reflect.New(rs.Type()).Elem()
rs2.Set(rs)
rf = rs2.Field(0)
rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()
// Now rf can be read. Setting will succeed but only affects the temporary copy.
请参阅操场上的完整示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)