第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

接口實現(xiàn)中的非接口方法

接口實現(xiàn)中的非接口方法

Go
森林海 2021-04-09 22:18:31
我有一個定義方法的接口。我有一個實現(xiàn)此接口的結構。在其中,我已經從該接口實現(xiàn)了方法,并且還定義了其他方法。例如:package mainimport (    "fmt")   type Animal interface {    MakeNoise()}type Dog struct {    color string}/* Interface implementation */func (d *Dog) MakeNoise() {    fmt.Println("Bark!")}/* End Interface implementation */func (d *Dog) WagTail() {    fmt.Println(d.color + " dog: Wag wag")}func NewDog(color string) Animal {    return &Dog{color}}func main() {    dog := NewDog("Brown")    dog.MakeNoise()    dog.WagTail()}在操場上:https : //play.golang.org/p/B1GgoNToNl_l在此,WagTail()不是Animal接口的一部分,但屬于Dog結構。運行此代碼會出現(xiàn)錯誤dog.WagTail未定義(動物類型沒有字段或方法WagTail)。有沒有一種方法可以使結構堅持接口并定義其自己的方法?
查看完整描述

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ù)代碼不使用此類約束,因為它們限制了界面概念的實用性。但是有時候,它們對于解決相似接口之間的歧義是必不可少的。


查看完整回答
反對 回復 2021-04-19
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

這可能對您有幫助。

d := dog.(*Dog)
d.WagTail()

在操場上:https : //play.golang.org/p/KlNqpmvFTJi


查看完整回答
反對 回復 2021-04-19
  • 2 回答
  • 0 關注
  • 305 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號