1 回答
TA贡献1860条经验 获得超8个赞
因为fmt.Print家庭使用reflect,并reflect授予访问未导出字段的权力,因此reflect.Value.Field. 请注意,未导出的字段只能以这种方式读取,而不能写入。
一些代码:
package main
import (
"fmt"
"reflect"
)
type A struct {
A int
b int
}
func main() {
fmt.Println("Hello, playground")
a := A{1, 2}
va := reflect.ValueOf(&a).Elem()
exported := va.Field(0)
unexported, unexportedName := va.Field(1), va.Type().Field(1)
fmt.Println(unexportedName, unexported)
// exported settable but unexported not settable
fmt.Println(exported.CanSet(), unexported.CanSet())
exported.Set(reflect.ValueOf(int(3)))
fmt.Println(a)
// this will panic
unexported.Set(reflect.ValueOf(int(5)))
fmt.Println(a)
}
游乐场:https://play.golang.org/p/6mhFR7efPEc
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报