考虑实验切片包中的两个函数:Contains 和 Grow。两个函数都接受切片参数,但具有不同的类型约束:
Contains 的第一个参数具有类型 []E,其中 E 受可比较约束,表明 E 必须可比较。另一方面,Grow 的第一个参数具有类型 S,受 ~[]E 约束,表明 S 必须具有作为 E 切片的基础类型。
乍一看,使用这两种类型约束似乎没有实际区别。但是,当您需要返回与 Grow 中的参数相同类型的切片时,情况并非如此。
如果您需要返回与输入参数类型相同的切片,您必须使用本身约束为切片的类型参数(例如,~[]E)。这允许函数返回与参数相同类型的值。
让我们考虑 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。
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)的类型参数。
以上是Go 中何时使用 ~[]E 与 []E 作为切片参数?的详细内容。更多信息请关注PHP中文网其他相关文章!