[英]How GoLang's typecast to interface implemented by a struct and embedded struct works
我最近遇到了一個正在執行我不理解的代碼。
有多個結構具有相同的嵌入式結構和一個接口,該接口定義了返回指向每個結構的指針的方法。 該接口由嵌入式結構實現,但僅“部分”由單個結構實現,因此,每個結構僅實現返回指向該結構的指針的方法。
為了更好地理解,以下是代表性代碼:
type BarStocks interface {
GetVodka() *Vodka
GetMartini() *Martini
GetBourbon() *Bourbon
GetNegroni() *Negroni
GetManhattan() *Manhattan
}
type BaseAttributes struct {
ID uuid.UUID
Quantity float64
CreatedAt time.Time
UpdatedAt time.Time
}
func (e *BaseAttributes) GetVodka() *Vodka {
return nil
}
func (e *BaseAttributes) GetMartini() *Martini {
return nil
}
func (e *BaseAttributes) GetBourbon() *Bourbon {
return nil
}
func (e *BaseAttributes) GetNegroni() *Negroni {
return nil
}
func (e *BaseAttributes) GetManhattan() *Manhattan {
return nil
}
然后,每個單獨的結構僅實現返回其指針的方法,例如:
type Vodka struct {
BaseAttributes
Label string
}
func (v *Vodka) GetVodka() *Vodka {
return v
}
現在在代碼中,此設置用於將單個結構作為指針類型轉換到接口,如下所示:
func someFunc() BarStocks {
v := Vodka{}
return &v
}
現在我對Go語言還不是很深入,因此無法理解指向該結構的指針如何成為與接口相同的類型。
預先感謝您對此的任何見解。
我會盡力回答我認為您要提出的問題。
有關嵌入的文檔說明了您所看到的行為,
嵌入與子類的不同是一種重要的方式。 當我們嵌入一個類型時,該類型的方法成為外部類型的方法,但是當調用它們時,該方法的接收者是內部類型,而不是外部類型。
這就解釋了Vodka
結構(該結構嵌入了實現BaseAttributes
中所有方法的結構BarStocks
)可以滿足Barstocks
接口。 但是,此摘錄並未解釋我們如何有效地為我們的Vodka
結構重寫GetVodka()
。
為了理解這一點,我們需要閱讀文檔中的另一個摘錄。
嵌入類型引入了名稱沖突的問題,但是解決它們的規則很簡單。 首先,字段或方法X將其他任何項X隱藏在該類型的更深層嵌套的部分中。
此摘錄說明,如果Vodka
實現GetVodka()
並嵌入結構( BaseAttributes)
,該結構也實現GetVodka()
,則最外面的定義是優先的定義。
這些行為的結合說明了Vodka
如何滿足BarStocks
接口並具有示例代碼中所見的行為。
伏特加(Vodka)缺少但BarStocks上存在的其他方法是針對BaseAttributes實現的,如果伏特加(Vodka)缺少該方法,則將調用嵌入式strut中的方法。
注意,嵌入式結構中的方法將無法訪問父結構成員。 還要注意,如果要在父結構中定義嵌入結構的方法時調用它(因為GetVodka是伏特加的),則可以在該方法的前面加上嵌入類型的名稱。 例如
myDrink := someFunc()
myDrink.BaseAttributes.GetVodka()
在這種情況下,這顯然無濟於事,因為所有BaseAttribute方法都返回nil,但將來可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.