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

标签 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"
} 

最佳答案

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/

相关文章:

go - 使用 go-sqlmock 模拟 gorm `could not match actual sql` 时出现 `updates` 错误?

c# - 在 C# 中获取命名空间中的类列表

c# - 在业务应用程序中使用反射可能存在的弱点

Java反射,获取类字符串数组

string - 使用需要转义的字符在 golang 中创建一个字符串

for-loop - for-loop 中的 time.Time#UnmarshalBinary 确实连续输出相同的值

使用反射调用 PumpEvents 时出现 java.lang.illegalArgumentException

c# - 两种不相等的类型应该是

go - 检查 map 中是否存在 key 为 "if statement"条件

go - 如何在golang模板中迭代一系列数字?