【发布时间】:2021-03-23 03:43:22
【问题描述】:
给定一个带参数的函数(即指向结构的指针),我想实例化此参数的一个类型。
例如,对于这个函数:
func MyFunction(myStruct *MyStruct) {}
使用反射我想创建一个包含与x := &MyStruct{} 完全相同的变量。
这是代码示例:
package main
import (
"fmt"
"reflect"
)
type MyStruct struct {
}
func main () {
reflectedFunction := reflect.TypeOf(MyFunction)
argType := reflectedFunction.In(0)
reflectedParameter := reflect.New(argType)
actual := reflectedParameter.Interface()
fmt.Println(actual)
expected := &MyStruct{}
fmt.Println(expected)
}
func MyFunction(myStruct *MyStruct) {
}
如果你执行它,你会看到它们包含不同的信息:
0xc00000e028 // actual
&{} // expected
这个问题不是关于我为什么要这样做,所以请避免建议不要这样做等。
【问题讨论】:
-
不一样
-
我设法使用 Elem().Interface() 获得了“相同”的值,打印返回的结果并不完全相同,但似乎内容实际上是相同的(使用 printf 检查%#v)
-
阅读所有评论并回答。这一直有争议......
-
@fj123x。
Elem().Interface()为您提供相同的 type,但它仍然是一个 nil 指针。您必须首先使用具有正确类型的reflect.New。您无法动态获取*MyStruct的实际变量,因为类型是在编译时定义的,因此您必须满足于包含该类型的接口。
标签: go reflection