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 關注
- 200 瀏覽
添加回答
舉報