gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:50:26 25 4
gpt4 key购买 nike

我有这种类型的实现:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com