Println如何访问golang中未导出的字段?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Println如何访问golang中未导出的字段?相关的知识,希望对你有一定的参考价值。
package test
import (
"fmt"
)
type DP struct {
array []int
cols int
}
func (v *DP) Init(rs, cs int) {
v.array = make([]int, rs*cs, rs*cs)
v.cols = cs
}
func (v *DP) Get(r, c int) int {
return v.array[r*v.cols+c]
}
package main
import (
"fmt"
"test"
)
func main() {
var k, x, n int
var dp test.DP
fmt.Scanf("%d %d %d", &n, &k, &x)
dp.Init(n, k)
fmt.Println(dp) // print the contents of dp.array
fmt.Printf("%d %d %d", n, k, x)
}
Println如何访问所有未导出的字段。为什么没有给出任何错误,例如dp.array undefined(无法引用未导出的字段或方法数组)
答案
因为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
以上是关于Println如何访问golang中未导出的字段?的主要内容,如果未能解决你的问题,请参考以下文章