首頁 > 後端開發 > Golang > 如何在 Go 中嵌入第三方類型?

如何在 Go 中嵌入第三方類型?

王林
發布: 2024-02-09 20:20:26
轉載
1104 人瀏覽過

如何在 Go 中嵌入第三方类型?

在Go語言中,嵌入第三方類型是一種強大的功能,可以讓我們在不修改原有程式碼的情況下擴展和自訂現有的類型。透過嵌入第三方類型,我們可以繼承其方法和屬性,實現程式碼的複用和擴充。本文將為您介紹如何在Go語言中嵌入第三方類型,並給出一些實際應用場景的範例。無論您是Go語言的初學者還是有一定經驗的開發者,相信本文都能為您提供實用的指導。

問題內容

在我的應用程式中,使用了 decimal 套件 github.com/shopspring/decimal。

為了在 decimal.decimal 類型上編寫自訂函數,我創建了自己的 decimal 類型並嵌入了 decimal.decimal#:

type decimal struct {
    decimal.decimal
}
登入後複製

這很好用,我現在可以存取 decimal 物件上的方法:

a := decimal{decimal.newfromfloat(1.0)}
b := decimal{a.neg()}
登入後複製

某些 decimal.decimal 方法需要 decimal.decimal, f.ex 類型的參數:

c := decimal{a.add(b)}
登入後複製

上面的行由於錯誤而無法編譯:cannot use b (decimal類型的變數)作為十進制。 a.add參數中的十進位值

我嘗試將 decimal 轉換為 decimal.decimal:

c := decimal{a.add((decimal.decimal)(b))}
登入後複製

由於以下錯誤,上述程式碼無法編譯:

cannot convert b (variable of type Decimal) to decimal.Decimal
登入後複製

問題:如何以允許使用“父”方法的方式擴展/嵌入第三方類型並且可以使用擴展類型作為方法中的參數這需要父母類型的論證嗎?

解決方法

使用類型宣告但沒有明確欄位名稱的欄位稱為嵌入欄位。嵌入欄位必須指定為類型名稱 t 或指向非介面類型名稱 *t 的指針,且 t 本身可能不是指針類型。 非限定類型名稱充當欄位名稱。

因此,一個快速而骯髒的解決方案是簡單地使用「非限定類型名稱」來存取該欄位。

_ = decimal{a.add(b.decimal)}
登入後複製

但是,如果您在使用新類型時尋求更無縫的體驗,那麼您唯一的選擇就是重新聲明需要原始類型的方法並在其位置使用新類型。這些重新聲明的方法只需是將一個實例的嵌入欄位傳遞給另一個實例的嵌入欄位的方法的簡單包裝器。例如:

type Time struct {
    time.Time
}

func (t Time) In(loc *time.Location) Time {
    return Time{t.Time.In(loc)}
}

func (t Time) Equal(u Time) bool {
    return t.Time.Equal(u.Time)
}
登入後複製

以上是如何在 Go 中嵌入第三方類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板