1 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果實(shí)施必須奏效
如果實(shí)現(xiàn)接口的值必須有效(例如,它的方法必須可以調(diào)用而不會(huì)出現(xiàn)恐慌),那么你就不能這樣做。
方法聲明必須在頂層(文件級(jí))。要實(shí)現(xiàn)一個(gè)具有 0 個(gè)以上方法的接口,需要在某處聲明方法。
當(dāng)然,您可以使用一個(gè)結(jié)構(gòu)并嵌入一個(gè)現(xiàn)有的實(shí)現(xiàn),但話又說回來,它需要已經(jīng)有一個(gè)現(xiàn)有的實(shí)現(xiàn),其方法必須已經(jīng)在“某處”定義:在文件級(jí)別。
如果您需要一個(gè)“虛擬”但可行的實(shí)現(xiàn),他們會(huì)使用/傳遞任何MyAdd實(shí)現(xiàn),例如您的類型的值。如果您想強(qiáng)調(diào)實(shí)現(xiàn)無關(guān)緊要,則創(chuàng)建一個(gè)虛擬實(shí)現(xiàn),其名稱表明:
type DummyOp struct{}
func (DummyOp) Binary(_, _ int) int { return 0 }
func (DummyOp) Ternary(_, _, _ int) int { return 0 }
如果您需要?jiǎng)討B(tài)地提供一些方法的實(shí)現(xiàn),您可以創(chuàng)建一個(gè)委托結(jié)構(gòu)類型來保存這些方法的函數(shù),實(shí)際的方法檢查是否設(shè)置了相應(yīng)的函數(shù),在這種情況下調(diào)用它,否則什么都不會(huì)完畢。
這就是它的樣子:
type CustomOp struct {
binary func(int, int) int
ternary func(int, int, int) int
}
func (cop CustomOp) Binary(a, b int) int {
if cop.binary != nil {
return cop.binary(a, b)
}
return 0
}
func (cop CustomOp) Ternary(a, b, c int) int {
if cop.ternary != nil {
return cop.ternary(a, b, c)
}
return 0
}
使用它時(shí),您可以自由地只提供函數(shù)的一個(gè)子集,其余的將是空操作:
RandomNumOp(CustomOp{
binary: func(a, b int) int { return a + b },
})
如果不需要實(shí)施工作
如果你只需要一個(gè)實(shí)現(xiàn)接口的值,但你不需要它的方法是“可調(diào)用的”(調(diào)用時(shí)不要恐慌),你可以簡(jiǎn)單地使用匿名結(jié)構(gòu)文字,嵌入接口類型:
var op NumOp = struct{ NumOp }{}
- 1 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報(bào)