Reflection 如何使用反射在运行时更改方法实现?

Reflection 如何使用反射在运行时更改方法实现?,reflection,go,Reflection,Go,我有这种类型的实现: type A struct{ name string } func (a A) getName() string { return "My name is " + a.name } 如何使用反射更改此类型的方法getName()的实现? 例如,我希望使用下一个实现而不是当前实现: func newGetName() string { return "test reflection" } 注意,惯用的围棋是不这样做,而是使用接口: 见: 包干管 impo

我有这种类型的实现:

type A struct{
  name string
}

func (a A) getName() string {
  return "My name is " + a.name 
}
如何使用反射更改此类型的方法getName()的实现? 例如,我希望使用下一个实现而不是当前实现:

func newGetName() string {
  return "test reflection"
} 

注意,惯用的围棋是不这样做,而是使用接口:

见:

包干管

import "fmt"

type Aer interface {
    getName() string
}

type A struct {
    name string
}

func (a A) getName() string {
    return "My name is " + a.name
}

type testA struct {
    a A
}

func (ta testA) getName() string {
    return "NEW: My name is " + ta.a.name
}
func main() {
    a := A{name: "nameA"}
    fmt.Println(a.getName())
    ta := testA{a: a}
    fmt.Println(ta.getName())
}
输出:

My name is nameA
NEW: My name is nameA

Go是一种编译语言。因此,不可能在运行时修改事物的实现。您可以做的是将place函数指针更改为:

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()
,结果是
“我的名字是汉斯”
。您可以很好地使用方法表达式和许多其他特性,但是
getName
是一个结构成员,而不是
a
的方法,因此请记住这一点。如果要赋予
getName
新的含义,请为其指定不同的内容:

foo.getName = func() string {
    return "test reflection"
}

如果您事先知道
getName
可能具有的实现,则另一个特别适用的想法是在
a
中添加一个新成员,说明
getName
当前具有的实现,然后切换此变量。

我无法更改此行:fmt.Println(a.getName())我确实需要其他解决方案!你不能改变它。我也没有。这就是为什么我将您的对象包装在一个接口中。您使用“ta”而不是“a”来调用新方法。我不能进行此替换。@INTEROPER您的方法没有导出,这意味着我怀疑您能否通过反射调用它。我可以更改指向该方法实现的指针吗?您不能这样做。这些疯狂的东西会让你把任何(导出的)方法变成任意的,甚至是有害的东西。你必须寻找另一种方法来解决你的问题。这似乎比我的答案更接近OP的目标+1.