3 回答

TA貢獻1951條經(jīng)驗 獲得超3個贊
在 Go 中,你通常會通過組合來做到這一點:
type StatHandler struct {
Handler // Anonymous member of type Handler
}
// ...Later on
var stathandler StatHandler
stathandler.addField("some field", "some value")

TA貢獻1784條經(jīng)驗 獲得超7個贊
請注意,在 Go 中,為了訪問另一個包中的方法,您需要將其導(dǎo)出,這意味著您必須將方法的第一個字母大寫。
type Handler struct{
fields map[string]interface{}
}
func (handler *Handler) AddField(key string, value interface{}){ some code }
然后,如果您的包被命名為stathandler您可以訪問該AddField方法:
stathandler.AddField("some field", "some value")

TA貢獻1735條經(jīng)驗 獲得超5個贊
聲明的方法屬于特定類型。該type關(guān)鍵字創(chuàng)建了一個新的類型,其確實您在類型規(guī)范使用的類型不是“繼承”的方法。
addField()您聲明的方法屬于Handler,該類型StatHandler沒有任何方法,因為您沒有指定任何方法作為接收者類型。
如果你有一個類型的變量StatHandler并且你想調(diào)用addField()方法,你需要有一個類型的值*Handler。您可以通過使用類型轉(zhuǎn)換來獲得這樣的值,例如:
s := StatHandler{}
(*Handler)(&s).addField("somekey", "someval")
請注意,由于addField()有指針接收器,因此需要一個指針(因此使用&地址運算符),但*StatHandler只能轉(zhuǎn)換為*Handler.
如果您首先有一個*StatHandler指針:
sp := &StatHandler{}
(*Handler)(sp).addField("somekey", "someval")
由于新類型不會“繼承”底層類型的方法,因此您應(yīng)該考慮嵌入來實現(xiàn)您想要的,因為嵌入類型的方法和字段被提升為嵌入器類型:
type StatHandler struct {
Handler // Embed Handler, so addField() method will be promoted
}
s2 := StatHandler2{}
s2.addField("somekey", "someval")
試試Go Playground上的示例。
規(guī)范中涵蓋了類型具有哪些方法的確切定義:方法集。
- 3 回答
- 0 關(guān)注
- 164 瀏覽
添加回答
舉報