在 Go 的实验包切片中,两个函数 Contains 和 Grow 的第一个参数具有不同的类型参数。 Contains 接受可比较元素的切片 ([]E),而 Grow 接受限制为切片类型的参数 (~[]E)。
实际注意事项
而这些声明在实践中可能看起来是等效的,但当您需要返回与输入参数相同类型的切片时,它们会有所不同。
何时使用 ~[]E 类型参数
当您必须返回与参数类型相同(可能命名)的切片时,请使用 ~[]E。例如,如果您想创建一个生成特定命名类型切片的泛型函数:
<code class="go">func Grow[S ~[]E, E any](s S, n int) S { // ... }</code>
何时使用 []E 类型参数
当不需要返回切片或者可以接受返回未命名切片时,请使用 []E:
<code class="go">func Contains[E comparable](s []E, v E) bool { // ... }</code>
演示
考虑 Grow 的两种实现():
<code class="go">// Using ~[]E func Grow[S ~[]E, E any](s S, n int) S { // ... } // Using []E func Grow2[E any](s []E, n int) []E { // ... }</code>
当传递自定义切片类型(以切片作为其基础类型)时,Grow() 可以返回相同类型的值,而 Grow2() 不能返回一个未命名的切片type.
输出:
x2 []int len=1 cap=12 x3 []int len=1 cap=12 y2 main.ints len=1 cap=12 y3 []int len=1 cap=12
如上所示,Grow2(y, 10) 返回意外类型的切片,这可能是不可取的。
以上是何时在 Go 中使用 ~[]E 和 []E 类型参数作为切片参数?的详细内容。更多信息请关注PHP中文网其他相关文章!