Handling Array/Slice Invariance in Go
In Go, one may encounter challenges working with arrays or slices of different element types. Consider the following example:
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, "") }
Upon compiling this code, you'll encounter errors due to Go's lack of array/slice covariance. Specifically:
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
A Flexible Solution
One approach to circumventing this issue is to define an interface that abstracts the common attributes of these arrays/slices:
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)) }
By encapsulating the behavior of these collections in an interface, you can access and manipulate them generically. This approach remains idiomatic within Go while providing the flexibility needed for handling different data types.
The above is the detailed content of How to Handle Go's Array/Slice Invariance When Working with Different Element Types?. For more information, please follow other related articles on the PHP Chinese website!