gpt4 book ai didi

go - Println 如何访问未导出的字段

转载 作者:行者123 更新时间:2023-12-01 19:57:36 29 4
gpt4 key购买 nike

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 (cannot refer to unexported field or method array)

这样的错误

最佳答案

因为 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)
}

Playground :https://play.golang.org/p/6mhFR7efPEc

关于go - Println 如何访问未导出的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58968501/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com