”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Go 中何时使用 ~[]E 与 []E 作为切片参数?

Go 中何时使用 ~[]E 与 []E 作为切片参数?

发布于2024-11-04
浏览:289

When to Use ~[]E vs []E for Slice Arguments in Go?

探索通用切片参数的微妙之处

考虑实验切片包中的两个函数:Contains 和 Grow。两个函数都接受切片参数,但具有不同的类型约束:

类型约束

Contains 的第一个参数具有类型 []E,其中 E 受到可比较的约束,表明 E 必须是可比较的。另一方面,Grow 的第一个参数具有类型 S,受 ~[]E 约束,表明 S 必须具有作为 E 切片的基础类型。

实际含义

乍一看,使用这两种类型约束似乎没有实际区别。然而,当您需要返回与 Grow 中的参数相同类型的切片时,情况并非如此。

切片约束类型参数的意义

如果您需要返回如果是与输入参数类型相同的切片,则必须使用本身约束为切片的类型参数(例如 ~[]E)。这允许函数返回与参数相同类型的值。

Grow 演示

让我们考虑 Grow 的两种实现:

func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s
func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E

当传递一个自定义类型的切片并将切片作为其基础类型时,Grow可以返回相同类型的值,而Grow2则不能。 grow2 只能返回未命名切片类型的值,[]E.

Example

type ints []int // user-defined slice type ints
x := []int{1} // initialize a slice x of type []int
x2 := Grow(x, 10) // x2 will be of type []int
y := ints{1} // initialize a slice y of type ints
y2 := Grow(y, 10) // y2 will be of type ints

这里,Grow2(y, 10) 接收一个 ints 类型的值,但返回一个 []int 类型的值,这不是

结论

总之,当函数调用需要返回与参数相同(可能命名)类型的切片时,使用本身约束为切片的类型参数(~[]E) 是必要的。否则,可以使用仅约束元素类型(E any)的类型参数。

版本声明 本文转载于:1729668019如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3