我有这种类型的实现:
type A struct{
name string
}
func (a A) getName() string {
return "My name is " + a.name
}
如何使用反射更改此类型的方法 getName() 的实现? 例如,我想使用下一个实现而不是当前的实现:
func newGetName() string {
return "test reflection"
}
最佳答案
Go 是一种编译型语言。因此,不可能在运行时修改事物的实现。您可以做的是更改函数指针指向的位置:
var getName func(string) = func(name string) {
return "my name is " + name
}
为了使它与结构一起工作,您必须使用一些技巧。首先将getName
作为成员添加到A
:
type A struct {
name string
getName func() string
}
然后我们将指向该结构的指针作为隐式(即封闭)参数包含在内:
foo := &A{name: "Hans"}
foo.getName = func() string {
return "my name is " + name
}
现在您可以调用 A.getName()
,结果是 "my name is hans"
。您可以很好地使用方法表达式和许多其他功能,但是 getName
是一个结构成员,而不是 A的方法
,所以请记住这一点。当你想给 getName
一个新的含义时,给它分配一些不同的东西:
foo.getName = func() string {
return "test reflection"
}
如果您事先知道 getName
可能有哪些实现,另一个特别适用的想法是向 A
添加一个新成员,说明 getName< 的实现
当前有,然后切换这个变量。
关于reflection - 如何使用反射在运行时更改方法实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28577489/