2 回答
TA贡献1798条经验 获得超3个赞
请注意,惯用的 Go不是这样做,而是使用接口:
包主
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
TA贡献1906条经验 获得超10个赞
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当前具有哪些实现,然后切换此变量。
- 2 回答
- 0 关注
- 187 浏览
添加回答
举报