Heim >Backend-Entwicklung >Golang >Wann sollten die Typparameter ~[]E und []E für Slice-Argumente in Go verwendet werden?

Wann sollten die Typparameter ~[]E und []E für Slice-Argumente in Go verwendet werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-24 01:47:01975Durchsuche

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

Unterschiede zwischen generischen Slice-Argumenten

In den experimentellen Paket-Slices von Go haben zwei Funktionen, Contains und Grow, unterschiedliche Typparameter für ihre ersten Argumente. Contains nimmt ein Segment vergleichbarer Elemente ([]E), während Grow ein auf Slice-Typen beschränktes Argument (~[]E) akzeptiert.

Praktische Überlegungen

While Diese Deklarationen mögen in der Praxis gleichwertig erscheinen, sie unterscheiden sich jedoch, wenn Sie ein Segment desselben Typs wie das Eingabeargument zurückgeben müssen.

Wann sollten ~[]E-Typparameter verwendet werden

Verwenden Sie ~[]E, wenn Sie ein Segment desselben (möglicherweise benannten) Typs wie das Argument zurückgeben müssen. Wenn Sie beispielsweise eine generische Funktion erstellen möchten, die ein Segment eines bestimmten benannten Typs vergrößert:

<code class="go">func Grow[S ~[]E, E any](s S, n int) S {
    // ...
}</code>

Wann sollten []E-Typparameter verwendet werden?

Verwenden Sie []E, wenn Sie kein Slice zurückgeben müssen oder wenn die Rückgabe eines unbenannten Slice akzeptabel ist:

<code class="go">func Contains[E comparable](s []E, v E) bool {
    // ...
}</code>

Demonstration

Betrachten Sie zwei Implementierungen von 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>

Bei der Übergabe eines benutzerdefinierten Slice-Typs (mit einem Slice als zugrunde liegendem Typ) kann Grow() einen Wert desselben Typs zurückgeben, während Grow2() dies nicht kann und ein unbenanntes Slice zurückgibt Typ.

Ausgabe:

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

Wie oben gesehen, gibt Grow2(y, 10) ein Segment eines unerwarteten Typs zurück, was möglicherweise nicht wünschenswert ist.

Das obige ist der detaillierte Inhalt vonWann sollten die Typparameter ~[]E und []E für Slice-Argumente in Go verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn