为了账号安全,请及时绑定邮箱和手机立即绑定

Println 如何访问未导出的字段

Println 如何访问未导出的字段

Go
暮色呼如 2023-08-07 11:15:43
package testimport (    "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 mainimport (    "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 这样的错误(无法引用未导出的字段或方法数组)
查看完整描述

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


查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信