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中未导出的字段?的主要内容,如果未能解决你的问题,请参考以下文章

golang如何访问接口字段

golang 如何查看channel通道中未读数据的长度

访问 Symfony2 控制器中未映射的字段

如何在golang中访问struct中的切片

GraphQL - 如何防止计算请求中未指定的资源中的字段?

.m 文件中未访问 UITableViewCell 中的标签