Println 如何访问未导出的字段

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 这样的错误(无法引用未导出的字段或方法数组)


暮色呼如
浏览 80回答 1
1回答

桃花长相依

因为fmt.Print家庭使用reflect,并reflect授予访问未导出字段的权力,因此reflect.Value.Field. 请注意,未导出的字段只能以这种方式读取,而不能写入。一些代码:package mainimport (    "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
打开App,查看更多内容
随时随地看视频慕课网APP