簡體   English   中英

GoLang的類型轉換到由結構體和嵌入式結構體實現的接口的工作方式

[英]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.

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