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!