在没有核心类型的泛型函数中迭代切片联合
在 Go 1.18 中,泛型函数允许我们使用类型动态地。然而,在迭代由不同类型组成的切片时遇到挑战需要额外考虑。
在处理类型约束时,我们必须了解核心类型的概念。当接口中的所有类型都存在单一基础类型或所有通道具有相同的元素类型和方向时,就存在核心类型。
在初始代码示例中:
type NumberSlice interface { []int64 | []float64 }
接口约束 NumberSlice 没有核心类型,因为它包含多个基础类型:[]int64 和 []float64。这意味着我们无法覆盖此接口的切片。
为了克服这个障碍,我们可以修改接口以需要基本类型:
type Number interface { int64 | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
这允许我们声明int64 或 float64 并在通用函数中迭代它们。
或者,我们可以定义一个带有核心的更明确的接口type:
type NumberSlice[N int64 | float64] interface { ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
此方法确保接口对于所有实现 NumberSlice[N] 的类型具有已知的底层类型 []N。
通过进行这些调整,我们可以成功迭代泛型函数中的切片联合,为我们的代码提供了更高的灵活性。
以上是如何在没有核心类型的情况下迭代 Go 泛型函数中的切片并集?的详细内容。更多信息请关注PHP中文网其他相关文章!