在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, "") }
編譯此程式碼時,由於 Go 缺乏陣列/切片協方差,您將遇到錯誤。具體來說:
prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument prog.go:27: cannot use farr (type []float) as type []interface { } in function argument
靈活的解決方案
規避此問題的一種方法是定義一個抽象這些數組/切片的公共屬性的介面:
package main import "fmt" type List interface { At(i int) interface{} Len() int } func printItems(header string, items List) { for i := 0; i < items.Len(); i++ { fmt.Print(items.At(i), " ") } fmt.Println() } 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 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中文網其他相關文章!