2 回答

TA貢獻1811條經(jīng)驗 獲得超5個贊
我是Go我的新手,所以我很好奇是否有人會得到更好的答案,但是我是這樣看的:
您希望在編譯時強制執(zhí)行,當在Add()上調(diào)用時IntSlice,其參數(shù)為int。好吧,這是您的操作方式:
func (i *IntSlice) Add(t int) {
? ? *i = append(*i, t)
}
由于沒有泛型,因此Add()每種類型的方法都會有所不同Bag,因此Bag假設您需要,接口將變?yōu)椋?/p>
type Bag interface {
? ? IsEmpty() bool
? ? Size() int
}
這對我來說很有意義,因為您不能Bag繞過一圈,只扔任何東西。Bag僅僅知道某物是一個東西還不足以知道如何調(diào)用Add()它。您必須知道Bag您要處理的是哪種類型。
您可以使接口特定于該類型,例如IntBag,但是由于實際上只有一種類型可以滿足該接口,因此您也可以刪除該接口并將其名稱更改IntSlice為IntBag。
基本上,這意味著完全放棄所有類似于泛型的東西,而只是使用一些可以滿足您需要的方法來創(chuàng)建類型:
type IntBag []int
func (b *IntBag) Add(i int) {
? ? *b = append(*b, i)
}
func (b IntBag) IsEmpty() bool {
? ? return len(b) == 0
}
func (b IntBag) Size() int {
? ? return len(b)
}
更新:有時泛型確實會派上用場。在我看來,我們只能根據(jù)具體情況選擇最適合特定問題的方法。使用空接口和反射,您可以得到一些類似泛型的行為,但是它看起來很丑陋,并且您放棄了一些編譯時類型檢查?;蛘吣艞壏盒投M行一些代碼重復?;蛘吣皇怯猛耆煌姆绞絹碜?。
幾周前,我問了一個問題,關(guān)于我應該如何使用Go來處理看起來像我需要類層次結(jié)構(gòu)的問題。答案基本上是沒有通用的解決方案。視情況而定。我認為泛型也是如此:Go中沒有泛型,也沒有將基于泛型的解決方案轉(zhuǎn)換為Go的通用解決方案。
在許多情況下,您可能會在另一種語言中使用泛型,但是在Go中,接口是完全足夠的(或真正的亮點)。您的示例在這里,接口并不是真正合適的替代品。
- 2 回答
- 0 關(guān)注
- 217 瀏覽
添加回答
舉報