1 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
這稱為“鴨子類型”,它允許在需要的地方定義接口,而不是作為數(shù)據(jù)類型本身的一部分??紤]以下類型:
type X struct {...}
func (X) f()
func (X) g()
func (X) h()
該類型X具有三種方法:f()、g()、h()。如果你有一個(gè)數(shù)據(jù)結(jié)構(gòu)或函數(shù)需要調(diào)用f()方法,你可以定義一個(gè)接口:
type FIntf interface {
f()
}
現(xiàn)在X實(shí)現(xiàn)該接口。X您可以在需要的地方傳遞實(shí)例FIntf。
如果在另一個(gè)模塊中您需要g()和h(),您可以在那里定義一個(gè)接口:
type GIntf interface {
g()
h()
現(xiàn)在X實(shí)現(xiàn)了GIntf。
如果您有一個(gè)未實(shí)現(xiàn)您需要的接口的第三方庫,這尤其有用。您可以簡(jiǎn)單地定義一個(gè)使用它的接口,并使用第三方類型和正確的方法集來實(shí)現(xiàn)您的接口。
此方法的主要優(yōu)點(diǎn)是您仍然可以模擬傳統(tǒng)的接口概念,在其中定義接口及其具體實(shí)現(xiàn)。最重要的是,您可以根據(jù)需要靈活地定義不同的接口,而無需修改實(shí)現(xiàn)。在像 Java 這樣的語言中,如果您有一個(gè)函數(shù)可以獲取某個(gè)接口,而您的對(duì)象沒有,則即使原始類型上存在方法集,您也必須編寫一個(gè)適配器。在 Go 中,你不需要這樣做。
鴨子類型還允許在調(diào)用方法時(shí)實(shí)現(xiàn)類型安全。例如,如果您有一個(gè)函數(shù)必須調(diào)用 methodx()及其y()參數(shù)之一,請(qǐng)定義一個(gè)包含x()and的接口y(),并使用類型斷言來驗(yàn)證參數(shù)是否實(shí)現(xiàn)了這兩個(gè)方法。
- 1 回答
- 0 關(guān)注
- 153 瀏覽
添加回答
舉報(bào)