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

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

依賴接口的golang接口

依賴接口的golang接口

Go
白衣非少年 2022-03-02 19:28:01
我不確定這些應(yīng)該是兩個(gè)單獨(dú)的問題還是一個(gè),但在我看來,這是一個(gè)由兩個(gè)部分組成的問題 - 應(yīng)該如何使用 go 接口?我有這兩個(gè)斗爭(zhēng):接口的方法是全局范圍的:如果我有接口 A 和接口 B,它們都實(shí)現(xiàn)了相同的方法 Foo,但具有不同的參數(shù)或返回類型,我無法從同一類型同時(shí)實(shí)現(xiàn)兩者。例如,我在一個(gè)返回類型為 []byte 的接口和另一個(gè) ([]byte, error) 接口中有 GetBytes() 方法我應(yīng)該如何克服這個(gè)問題?我遇到的另一個(gè)問題是,當(dāng)我嘗試定義接口時(shí)說接口 A 具有返回在同一層中定義的接口 B 的方法?,F(xiàn)在,如果我想創(chuàng)建一個(gè)實(shí)現(xiàn) A 的對(duì)象,如果我返回實(shí)現(xiàn) B 的結(jié)構(gòu),則 go 不夠聰明,無法推斷該方法實(shí)現(xiàn)了 A 中的方法,它迫使我創(chuàng)建對(duì) B 的依賴。這似乎完全擊敗了首先說明接口工作的方式。我怎樣才能避免這個(gè)問題?例如,如果我有:type B interface {    Bar()}type A interface {    Foo() B}對(duì)于以下結(jié)構(gòu):type b_impl struct{}func (b b_impl) Bar() {}type a_impl struct{}一個(gè) foo 方法func (a a_impl) Foo() b_impl {}不滿足接口A,我需要做到:func (a a_impl) Foo() B {}這對(duì)聲明 B 的包產(chǎn)生依賴關(guān)系。
查看完整描述

2 回答

?
阿波羅的戰(zhàn)車

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

第一個(gè)問題:當(dāng)你想做不同的任務(wù)時(shí),你需要使用不同的函數(shù)名。讓我們看看 strconv 包中的標(biāo)準(zhǔn)庫是如何解決的:https ://golang.org/pkg/strconv/#pkg-index


在那里查看 append 函數(shù)的不同聲明。每種不同類型都有功能。


因此,如果您期望 FooInt 功能,您的界面也應(yīng)該是 FooInter,...


第二個(gè)問題:作為一個(gè)小例子。當(dāng)你想使用 io.Writer 接口時(shí),你不需要導(dǎo)入整個(gè) io 包。將 Writer 聲明復(fù)制到您自己的包中是完全可以的。如果你這樣做正確,每個(gè) io.Writer 實(shí)現(xiàn)都會(huì)自動(dòng)實(shí)現(xiàn)你自己的 Writer 接口。


閱讀其他評(píng)論后,您可能有不同的情況:


假設(shè)有一個(gè)包 a 和 b 具有接口 aA 和 bB 如果有這樣的情況:


type A interface{

  Foo() b.B

}

你必須為aA編寫一個(gè)實(shí)現(xiàn),然后你需要導(dǎo)入包b。但這會(huì)使您的二進(jìn)制文件不會(huì)更大,因?yàn)槟鷮⑹冀K需要導(dǎo)入包 a,這取決于 b。


查看完整回答
反對(duì) 回復(fù) 2022-03-02
?
互換的青春

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

為了實(shí)現(xiàn)一個(gè)接口,你需要有完全相同的方法名和簽名。表示簽名必須具有相同的類型。


盡管看起來很奇怪,但這兩個(gè)沒有相同的簽名:


Foo() B

Foo() b_impl {}

b_impl實(shí)現(xiàn)沒關(guān)系B。


為了克服需要在導(dǎo)入包B中聲明,可以使用匿名類型。這樣,編譯器將不需要方法簽名的特定類型。


type A interface {

    Foo() interface{Bar()}

}

這也可以寫成嵌入B:


type A interface {

    Foo() interface{B}

}

盡管如此,a_impl必須具有相同的簽名,因此它還需要返回一個(gè)匿名接口。您也可以B在 的包中聲明相同的接口a_impl,并將其嵌入到匿名接口中。


package impl


type B interface {

    Bar()

}


type b_impl struct{}


func (b b_impl) Bar() {}


type a_impl struct{}


func (a a_impl) Foo() interface{B} {

    return b_impl{}

}

我不知道這是否是一種不好的做法,可能有些情況需要重新設(shè)計(jì)而不是這樣做。


查看完整回答
反對(duì) 回復(fù) 2022-03-02
  • 2 回答
  • 0 關(guān)注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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