„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wann sollte ~[]E vs. []E für Slice-Argumente in Go verwendet werden?

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

Veröffentlicht am 04.11.2024
Durchsuche:956

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

Erkunden 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 Comparable 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

zurück, wenn ein Slice eines benutzerdefinierten Typs mit einem Slice als zugrunde liegendem Typ übergeben wird , Grow kann einen Wert desselben Typs zurückgeben, Grow2 hingegen nicht. Grow2 kann nur einen Wert eines unbenannten Slice-Typs zurückgeben, []E.

Example

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

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

Schlussfolgerung

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

Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729668019 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3