
利用介面解決Go 中的陣列/切片協方差缺陷
在Go 中,陣列/切片協方差的缺乏在使用時帶來了挑戰不同類型的陣列或切片。考慮以下場景:
1 2 3 4 5 6 7 8 9 10 | func printItems(header string, items [] interface {}, fmtString string) {
}
func main() {
var iarr = []int{1, 2, 3}
var farr = []float{1.0, 2.0, 3.0}
printItems( "Integer array:" , iarr, "" )
printItems( "Float array:" , farr, "" )
}
|
登入後複製
此程式碼嘗試使用通用 printItems 函數列印整數數組和浮點數組。但是,由於 Go 對集合協方差的限制,它會遇到編譯錯誤。
使用介面的解決方案
克服此限制的慣用方法是使用介面。透過定義封裝清單大小和索引的接口,我們可以建立為不同資料類型實現它的類型:
1 2 3 4 5 6 7 8 9 10 11 12 13 | type List interface {
At(i int) interface {}
Len() int
}
type IntList []int
type FloatList []float64
func (il IntList) At(i int) interface {} { return il[i] }
func (fl FloatList) At(i int) interface {} { return fl[i] }
func (il IntList) Len() int { return len(il) }
func (fl FloatList) Len() int { return len(fl) }
|
登入後複製
用法
使用這些類型和定義的接口,我們現在可以一般訪問和打印數組:
1 2 3 4 5 6 7 8 9 10 11 12 13 | func printItems(header string, items List) {
for i := 0; i < items.Len(); i++ {
fmt. Print (items.At(i), " " )
}
fmt.Println()
}
func main() {
var iarr = []int{1, 2, 3}
var farr = []float64{1.0, 2.0, 3.0}
printItems( "Integer array:" , IntList(iarr))
printItems( "Float array:" , FloatList(farr))
}
|
登入後複製
結論
雖然泛型提供了更優雅的解決方案,但使用接口仍然是處理Go 中集合協方差的強大方法,使我們能夠使用以通用方式處理不同的資料類型。
以上是介面如何解決 Go 的陣列/切片協方差問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!