gpt4 book ai didi

pointers - reflect.New 返回 而不是初始化的结构

转载 作者:IT王子 更新时间:2023-10-29 01:23:46 25 4
gpt4 key购买 nike

我正在为我正在构建的库使用反射,但我对 reflect.New 有一些不了解。

type A struct {
A int
B string
}

func main() {

real := new(A)
reflected := reflect.New(reflect.TypeOf(real)).Elem().Interface()
fmt.Println(real)
fmt.Println(reflected)
}

给予:

$ go run *go
&{0 }
<nil>

难道 reflect.New 也应该返回 &{0 } 吗? ( Runnable Version )

最终,我希望能够遍历反射结构的字段(reflected.NumField() 给出 reflected.NumField 未定义(类型接口(interface) {} 是没有方法的接口(interface))) 并使用SetIntSetString等。

谢谢,

最佳答案

您使用了内置的 new()创建 real 变量时的函数,它返回一个指针! real 的类型是*A,而不是A!这就是困惑的根源。

reflect.New()返回指向给定类型的(归零)值的指针(包装在 reflect.Value 中)。如果您传递类型 A,您将返回一个包装的 *AA 已初始化/归零。如果你传递类型 *A,你会得到一个包装的 **A*A 初始化(归零),以及任何指针类型都是 nil

你基本上要求 reflect.New() 创建一个指针类型的新值 (*A),并且 - 如前所述 - 它的零值是

您必须传递类型 A(而不是类型 *A)。它是这样工作的(在 Go Playground 上试试):

real := new(A)
reflected := reflect.New(reflect.TypeOf(real).Elem()).Elem().Interface()
fmt.Println(real)
fmt.Println(reflected)

或者像这样(Go Playground):

real := A{}
reflected := reflect.New(reflect.TypeOf(real)).Elem().Interface()
fmt.Println(real)
fmt.Println(reflected)

关于pointers - reflect.New 返回 <nil> 而不是初始化的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43072451/

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