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

Patricia Arquette
Release: 2024-10-24 01:47:01
Original
860 people have browsed it

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>
Copy after login

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>
Copy after login

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>
Copy after login

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
Copy after login

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!

source:php
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!