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
依此类推.
谢谢,
您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)