2 回答

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。

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ì)而不是這樣做。
- 2 回答
- 0 關(guān)注
- 184 瀏覽
添加回答
舉報(bào)