使用反射从新实例 (reflect.New) 调用方法

Posted

技术标签:

【中文标题】使用反射从新实例 (reflect.New) 调用方法【英文标题】:invoke a method from a new instance (reflect.New) with reflection 【发布时间】:2021-11-30 13:43:21 【问题描述】:

我想在 Go 中使用反射实例化一个对象并在其上调用一个方法。但是,我不知道该怎么做。我尝试了一些东西,但它不起作用。

type foo struct 
    name string


func (f *foo) Bar() 
    f.name = "baz"
    fmt.Println("hi " + f.name)


func main() 
    t := reflect.TypeOf(&foo)
    fooElement := reflect.New(t).Elem()
    fooElement.MethodByName("Bar").Call([]reflect.Value)

【问题讨论】:

【参考方案1】:

reflect.New 的工作方式与new 函数完全相同,因为它返回一个已分配的指向给定类型的指针。这意味着您希望将结构而不是指向结构的指针传递给reflect.TypeOf

t := reflect.TypeOf(foo)
fooV := reflect.New(t)

既然你现在有一个正确类型的指针值,你可以直接调用方法:

fooV.MethodByName("Bar").Call(nil)

https://play.golang.org/p/Aehrls4A8xB

【讨论】:

以上是关于使用反射从新实例 (reflect.New) 调用方法的主要内容,如果未能解决你的问题,请参考以下文章

golang复制一个指针对象(反射)

GoLanggolang 如何像Java 一样通过类名反射对象?

使用反射调用实例方法会引发 TargetException。

反射生成对象,调用对象方法

通过反射调用动态调用方法

php反射类的使用及Laravel对反射的使用介绍