Pointers 反映新回报<;零>;而不是初始化结构

Pointers 反映新回报<;零>;而不是初始化结构,pointers,go,reflection,struct,Pointers,Go,Reflection,Struct,我正在为我正在构建的库使用反射,但关于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 ru

我正在为我正在构建的库使用反射,但关于
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>
$go run*go
&{0 }
reflect.New
是否也应该返回
&{0}
?()

最后,我希望能够遍历反射结构的字段(
reflected.NumField()
gives
reflected.NumField未定义(类型接口{}是没有方法的接口)
),并使用
SetInt
SetString
等等

谢谢,

您在创建
real
变量时使用了内置函数,该变量返回指针!
real
的类型是
*A
,而不是
A
!这就是混乱的根源

返回一个指针,指向给定类型的(归零)值(包装为)。如果传递类型
A
,则返回一个已包装的
*A
A
已初始化/归零。如果传递类型
*A
,则返回一个已包装的
**A
*A
已初始化(归零),并且任何指针类型的零值均为
nil

基本上,您要求
reflect.New()
创建指针类型的新值(
*a
),并且–如前所述–其零值为
nil

您必须传递类型
A
(而不是类型
*A
)。它的工作原理如下(在桌面上试用):

或者像这样():

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