在 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中文网其他相关文章!