使用接口约束处理泛型函数中的切片联合
假设您需要一个对整数切片或整数切片进行操作的泛型函数一片漂浮物。要实现这一点,您可以利用泛型和接口约束,如下所示:
package main import "fmt" // NumberSlice defines an interface for either slice of integers or slice of floats. type NumberSlice interface { []int | []float64 } // add is a generic function that iterates over a slice of NumberSlice and prints its values. func add[N NumberSlice](n N) { for _, v := range n { fmt.Println(v) } } func main() { ints := []int{1, 2} add(ints) floats := []float64{3.14, 1.618} add(floats) }
但是,当尝试运行上述代码时,您可能会遇到以下错误:
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
出现此错误的原因是 NumberSlice 接口没有核心类型。接口的核心类型是接口中的所有类型都必须继承的单个基础类型。由于 NumberSlice 既可以接受整数切片,也可以接受浮点数切片,因此它不满足此要求。
要解决此问题,您可以使用基本类型而不是切片来定义接口:
type Number interface { int | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
这个修改后的函数将 Number 元素的切片作为参数,使其能够有效地处理整数和浮点数。
以上是如何处理 Go 泛型函数中的切片并集?的详细内容。更多信息请关注PHP中文网其他相关文章!