Home  >  Article  >  Backend Development  >  When to Use ~[]E and []E Type Parameters for Slice Arguments in Go?

When to Use ~[]E and []E Type Parameters for Slice Arguments in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-24 01:47:01861browse

When to Use ~[]E and []E Type Parameters for Slice Arguments in Go?

Differences Between Generic Slice Arguments

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn