[英]GoLang embedded struct class hierarchy
我正在閱讀這篇博文http://www.hydrogen18.com/blog/golang-embedding.html並發現了這些內容
這里有一個重要的區別。 如果myParent是Parent的實例,則myParent值不能作為Valueable。 您必須使用值&myParent(指向實例的指針)充當Valueable。 這是因為方法Value接收* Parent而不是Parent。
我創建了一個示例https://play.golang.org/p/ojTKZfx97g 。 所以問題是為什么調用方法myparent.Value()可以自己工作,但是在通過接口調用時不起作用
您的callValueable(v Valueable)
函數有一個Valueable
類型的參數,它是一個接口:
type Valueable interface {
Value() int64
}
您可以將任何值傳遞給它來實現此接口。 你的Parent
類型沒有,因為即使它有一個Value()
方法,該方法也有一個指針接收器:
func (i *Parent) Value() int64{
return i.value
}
根據Go語言規范( 方法集和接口類型 ), Parent
的方法集不包括此方法,只包含*Parent
的方法集。 引用規范:
...任何其他類型
T
的方法集由用接收器類型T
聲明的所有方法組成。 相應指針類型*T
的方法集是用receiver*T
或T
聲明的所有方法的集合(也就是說,它還包含T
的方法集)。
因此類型Parent
不實現Valueable
接口,但類型*Parent
確實實現了它。
所以,你可以傳遞一個*Parent
(一個指向 Parent
)作為一個Valuable
價值,你的方法,因為它實現了接口。 您可以使用地址&
運算符輕松獲取指針:
fmt.Println(callValueable(&myparent)) // This WORKS
根據Effective Go,如果值是可尋址的,則go將在調用指針接收器方法時自動插入&。
我對此做了進一步的研究,看起來我理解可尋址是錯誤的。 我在思考c ++這一行,而只要它是左值,那么它就是可尋址的。 但似乎在golang中並不是所有東西都是可以解決的
有趣的問題是為什么具體類型的接口不可尋址,以便golang可以自動執行&。 我找到了這個https://groups.google.com/forum/#!topic/golang-nuts/-ZoCu5m0kJ4 。 我引用了Steven Blenkinsop的答案,你可以在最后找到答案
在一個層面上,這是因為語言規范是這樣說的。 但最終,是的,這是因為獲取指針作為接收器傳遞的限制。 您不能獲取接口內的值的地址,因為其類型可能會更改(您可以為接口分配不同類型的值),以及其他原因。 因此,如果您需要指針接收器,則指針本身需要位於接口中。
所以我看到接口或映射的方式,因為底層內存地址可能會由另一個線程改變,這就是為什么go不會自動為我們插入&因為它無法保證內存地址在整個函數調用生命周期中都是有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.