簡體   English   中英

GoLang嵌入式struct類層次結構

[英]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 *TT聲明的所有方法的集合(也就是說,它還包含T的方法集)。

因此類型Parent不實現Valueable接口,但類型*Parent確實實現了它。

所以,你可以傳遞一個*Parent (一個指向 Parent )作為一個Valuable價值,你的方法,因為它實現了接口。 您可以使用地址&運算符輕松獲取指針:

fmt.Println(callValueable(&myparent)) // This WORKS

根據Effective Go,如果值是可尋址的,則go將在調用指針接收器方法時自動插入&。

我對此做了進一步的研究,看起來我理解可尋址是錯誤的。 我在思考c ++這一行,而只要它是左值,那么它就是可尋址的。 但似乎在golang中並不是所有東西都是可以解決的

  • 存儲在接口中的具體值不可尋址
  • map元素不可尋址

有趣的問題是為什么具體類型的接口不可尋址,以便golang可以自動執行&。 我找到了這個https://groups.google.com/forum/#!topic/golang-nuts/-ZoCu5m0kJ4 我引用了Steven Blenkinsop的答案,你可以在最后找到答案

在一個層面上,這是因為語言規范是這樣說的。 但最終,是的,這是因為獲取指針作為接收器傳遞的限制。 您不能獲取接口內的值的地址,因為其類型可能會更改(您可以為接口分配不同類型的值),以及其他原因。 因此,如果您需要指針接收器,則指針本身需要位於接口中。

所以我看到接口或映射的方式,因為底層內存地址可能會由另一個線程改變,這就是為什么go不會自動為我們插入&因為它無法保證內存地址在整個函數調用生命周期中都是有效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM