泛型切片参数:理解区别
在 Go 中,泛型编程引入了类型参数,允许函数对不同类型进行操作。感兴趣的一个领域是限制为切片类型的切片参数和通用切片参数之间的区别。
限制为切片类型的切片参数
考虑使用 slices.Grow 函数第一个参数受 ~[]E 约束。这意味着该参数的类型必须是元素类型为 E 的切片类型。
通用切片参数
相反,考虑 slices.Contains 函数第一个参数简单地输入为 []E。这允许任何元素类型为 E 的切片类型。
实际差异
最初,这两种类型的切片参数的行为似乎相似,因为它们两者都允许函数访问切片操作,例如追加和范围。然而,在返回切片时,有一个微妙但重要的区别。
返回切片
如果函数需要返回与以下类型相同类型的切片输入切片,您必须使用限制为切片类型的切片参数 (~[]E)。这确保返回的切片具有正确的基础类型。
示例
让我们比较两个 Grow() 实现:一个使用 ~[]E,另一个使用 [ ]E.
func Grow[S ~[]E, E any](s S, n int) S {
// ...
}
func Grow2[E any](s []E, n int) []E {
// ...
}
如果我们传递自定义类型的切片(例如,[]MyInt),Grow() 可以返回相同类型的值。然而,Grow2()只能返回通用切片类型([]E)。
结论
综上所述,如果需要返回相同的切片type 作为输入切片,您必须使用限制为切片类型的切片参数 (~[]E)。否则,使用通用切片参数就足够了。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3