1 回答

TA貢獻2036條經驗 獲得超8個贊
如果實施必須奏效
如果實現接口的值必須有效(例如,它的方法必須可以調用而不會出現恐慌),那么你就不能這樣做。
方法聲明必須在頂層(文件級)。要實現一個具有 0 個以上方法的接口,需要在某處聲明方法。
當然,您可以使用一個結構并嵌入一個現有的實現,但話又說回來,它需要已經有一個現有的實現,其方法必須已經在“某處”定義:在文件級別。
如果您需要一個“虛擬”但可行的實現,他們會使用/傳遞任何MyAdd實現,例如您的類型的值。如果您想強調實現無關緊要,則創建一個虛擬實現,其名稱表明:
type DummyOp struct{}
func (DummyOp) Binary(_, _ int) int { return 0 }
func (DummyOp) Ternary(_, _, _ int) int { return 0 }
如果您需要動態地提供一些方法的實現,您可以創建一個委托結構類型來保存這些方法的函數,實際的方法檢查是否設置了相應的函數,在這種情況下調用它,否則什么都不會完畢。
這就是它的樣子:
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
}
使用它時,您可以自由地只提供函數的一個子集,其余的將是空操作:
RandomNumOp(CustomOp{
binary: func(a, b int) int { return a + b },
})
如果不需要實施工作
如果你只需要一個實現接口的值,但你不需要它的方法是“可調用的”(調用時不要恐慌),你可以簡單地使用匿名結構文字,嵌入接口類型:
var op NumOp = struct{ NumOp }{}
- 1 回答
- 0 關注
- 153 瀏覽
添加回答
舉報