In Go's experimental package slices, two functions, Contains and Grow, have different type parameters for their first arguments. Contains takes a slice of comparable elements ([]E), while Grow takes an argument constrained to slice types (~[]E).
Practical Considerations
While these declarations may seem equivalent in practice, they differ when you need to return a slice of the same type as the input argument.
When to Use ~[]E Type Parameter
Use ~[]E when you have to return a slice of the same (possibly named) type as the argument. For example, if you want to create a generic function that grows a slice of a specific named type:
<code class="go">func Grow[S ~[]E, E any](s S, n int) S { // ... }</code>
When to Use []E Type Parameter
Use []E when you don't need to return a slice or when returning an unnamed slice is acceptable:
<code class="go">func Contains[E comparable](s []E, v E) bool { // ... }</code>
Demonstration
Consider two implementations of 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>
When passing a custom slice type (having a slice as its underlying type), Grow() can return a value of the same type, while Grow2() cannot and returns an unnamed slice type.
Output:
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
As seen above, Grow2(y, 10) returns a slice of an unexpected type, which may not be desirable.
The above is the detailed content of When to Use ~[]E and []E Type Parameters for Slice Arguments in Go?. For more information, please follow other related articles on the PHP Chinese website!