在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中文網其他相關文章!