首页 > 后端开发 > Golang > 正文

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

DDD
发布: 2024-10-24 04:23:02
原创
689 人浏览过

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

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!