reflect.New返回<nil>而不是初始化的struct

Mat*_*Nls 2 reflection struct pointers go

我正在为我正在建造的图书馆使用反射,但有一些我不明白的东西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)
}
Run Code Online (Sandbox Code Playgroud)

得到:

$ go run *go
&{0 }
<nil>
Run Code Online (Sandbox Code Playgroud)

是不是也reflect.New应该回来&{0 }?(Runnable版)

最终,我希望能够遍历反射结构(reflected.NumField()给出reflected.NumField undefined (type interface {} is interface with no methods))和使用的字段SetInt,SetString依此类推.

谢谢,

icz*_*cza 6

new()在创建real变量时使用了内置函数,它返回一个指针!类型real*A,不A!这是混乱的根源.

reflect.New()返回指向给定类型的(归零)值的指针(包含在a中reflect.Value).如果你传递了这个类型A,你会得到一个包装的*A,A初始化的/归零的.如果传递类型*A,则返回一个包装的**A,*A初始化的(归零),并且任何指针类型的零值都是nil.

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

你必须传递类型A(而不是类型*A).它的工作原理如下(在Go Playground上试试):

real := new(A)
reflected := reflect.New(reflect.TypeOf(real).Elem()).Elem().Interface()
fmt.Println(real)
fmt.Println(reflected)
Run Code Online (Sandbox Code Playgroud)

或者像这样(Go Playground):

real := A{}
reflected := reflect.New(reflect.TypeOf(real)).Elem().Interface()
fmt.Println(real)
fmt.Println(reflected)
Run Code Online (Sandbox Code Playgroud)