考虑实验切片包中的两个函数: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)的类型参数。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3