首页  >  文章  >  后端开发  >  Go 中何时使用 ~[]E 与 []E 作为切片参数?

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

DDD
DDD原创
2024-10-24 04:23:02694浏览

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。

示例

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn