2 回答

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

TA貢獻2012條經驗 獲得超12個贊
- 2 回答
- 0 關注
- 305 瀏覽
添加回答
舉報