2 回答

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
該錯(cuò)誤描述了這一切:
dog.WagTail未定義(動(dòng)物類型沒有字段或方法WagTail)
要實(shí)現(xiàn)一個(gè)接口,您應(yīng)該實(shí)現(xiàn)在其內(nèi)部定義的所有方法。
dog := NewDog("Brown")
dog.MakeNoise()
dog.WagTail()
現(xiàn)在NewDog返回包含MakeNoise方法但不包含的動(dòng)物接口WagTail。
管理需求的唯一方法是創(chuàng)建結(jié)構(gòu)類型的變量,Dog然后可以調(diào)用將Dog作為接收者的任何方法。
d := &Dog{"Brown"}
d.WagTail()
或者,您可以Dog從NewDog方法中返回指向struct的指針,就像在注釋中提到的代碼中那樣:
func NewDog(color string) *Dog {
return &Dog{color}
}
但是,如果未在接口中定義該方法,則無法使用struct作為方法接收者來實(shí)現(xiàn)它。
Golang提供了一種方法:
您可以要求編譯器通過嘗試使用T的零值或指向T的指針進(jìn)行賦值(如果適用)來檢查類型T是否實(shí)現(xiàn)了接口I。
type T struct{}
var _ I = T{} // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.
如果T(或* T,相應(yīng)地)未實(shí)現(xiàn)I,則錯(cuò)誤將在編譯時(shí)捕獲。
如果希望某個(gè)接口的用戶明確聲明他們實(shí)現(xiàn)了該接口,則可以在該接口的方法集中添加一個(gè)具有描述性名稱的方法。例如:
type Fooer interface {
Foo()
ImplementsFooer()
}
然后,類型必須將ImplementsFooer方法實(shí)現(xiàn)為Fooer,清楚地記錄事實(shí)并在godoc的輸出中宣布該事實(shí)。
type Bar struct{}
func (b Bar) ImplementsFooer() {}
func (b Bar) Foo() {}
大多數(shù)代碼不使用此類約束,因?yàn)樗鼈兿拗屏私缑娓拍畹膶?shí)用性。但是有時(shí)候,它們對(duì)于解決相似接口之間的歧義是必不可少的。

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
- 2 回答
- 0 關(guān)注
- 295 瀏覽
添加回答
舉報(bào)