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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

Go
森林海 2021-04-09 22:18:31
我有一個(gè)定義方法的接口。我有一個(gè)實(shí)現(xiàn)此接口的結(jié)構(gòu)。在其中,我已經(jīng)從該接口實(shí)現(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結(jié)構(gòu)。運(yùn)行此代碼會(huì)出現(xiàn)錯(cuò)誤dog.WagTail未定義(動(dòng)物類型沒有字段或方法WagTail)。有沒有一種方法可以使結(jié)構(gòu)堅(jiān)持接口并定義其自己的方法?
查看完整描述

2 回答

?
喵喵時(shí)光機(jī)

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ì)于解決相似接口之間的歧義是必不可少的。


查看完整回答
反對(duì) 回復(fù) 2021-04-19
?
繁花如伊

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊

這可能對(duì)您有幫助。

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

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


查看完整回答
反對(duì) 回復(fù) 2021-04-19
  • 2 回答
  • 0 關(guān)注
  • 295 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)