Wann sollte ~[]E vs. []E für Slice-Argumente in Go verwendet werden?

DDD
Freigeben: 2024-10-24 04:23:02
Original
689 Leute haben es durchsucht

When to Use ~[]E vs []E for Slice Arguments in Go?

Erkundung der Feinheiten generischer Slice-Argumente

Betrachten Sie zwei Funktionen aus dem experimentellen Slices-Paket: Contains und Grow. Beide Funktionen akzeptieren Slice-Argumente, jedoch mit unterschiedlichen Typeinschränkungen:

Typeinschränkungen

Das erste Argument von Contains hat den Typ []E, wobei E durch vergleichbar eingeschränkt wird, was anzeigt, dass E vergleichbar sein muss . Andererseits hat das erste Argument von Grow den Typ S, eingeschränkt durch ~[]E, was darauf hinweist, dass S einen zugrunde liegenden Typ haben muss, der ein Teil von E ist.

Praktische Implikationen

Auf den ersten Blick scheint es, dass es keinen praktischen Unterschied zwischen der Verwendung dieser beiden Typbeschränkungen gibt. Dies ist jedoch nicht der Fall, wenn Sie ein Slice desselben Typs wie das Argument in Grow zurückgeben müssen.

Die Bedeutung eines Slice-beschränkten Typparameters

Wenn Sie zurückgeben müssen Wenn Sie ein Slice desselben Typs wie das Eingabeargument verwenden möchten, müssen Sie einen Typparameter verwenden, der seinerseits auf ein Slice beschränkt (z. B. ~[]E). Dadurch kann die Funktion einen Wert desselben Typs wie das Argument zurückgeben.

Eine Demonstration mit Grow

Betrachten wir zwei Implementierungen von Grow:

func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s
func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E
Nach dem Login kopieren

Bei der Übergabe Grow ist ein Slice eines benutzerdefinierten Typs mit einem Slice als zugrunde liegendem Typ. Grow kann einen Wert desselben Typs zurückgeben, Grow2 hingegen nicht. Grow2 kann nur einen Wert eines unbenannten Slice-Typs zurückgeben, []E.

Beispiel

type ints []int // user-defined slice type ints
x := []int{1} // initialize a slice x of type []int
x2 := Grow(x, 10) // x2 will be of type []int
y := ints{1} // initialize a slice y of type ints
y2 := Grow(y, 10) // y2 will be of type ints
Nach dem Login kopieren

Hier empfängt Grow2(y, 10) einen Wert vom Typ ints, gibt aber einen Wert zurück vom Typ []int, was nicht das beabsichtigte Verhalten ist.

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass, wenn der Funktionsaufruf die Rückgabe eines Slice desselben (möglicherweise benannten) Typs wie das Argument erfordert, using Es ist ein Typparameter erforderlich, der selbst auf ein Slice (~[]E) beschränkt. Andernfalls kann ein Typparameter verwendet werden, der nur den Elementtyp (E beliebig) einschränkt.

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

Quelle:php
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!