利用介面解決Go 中的陣列/切片協方差缺陷
在Go 中,陣列/切片協方差的缺乏在使用時帶來了挑戰不同類型的陣列或切片。考慮以下場景:
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 對集合協方差的限制,它會遇到編譯錯誤。
使用介面的解決方案
克服此限制的慣用方法是使用介面。透過定義封裝清單大小和索引的接口,我們可以建立為不同資料類型實現它的類型:
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) }
用法
使用這些類型和定義的接口,我們現在可以一般訪問和打印數組:
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中文網其他相關文章!