Generische Slice-Argumente: Die Unterscheidung verstehen
In Go führt die generische Programmierung Typparameter ein, die es Funktionen ermöglichen, auf verschiedenen Typen zu arbeiten. Ein Bereich von Interesse ist die Unterscheidung zwischen Slice-Argumenten, die auf Slice-Typen beschränkt sind, und generischen Slice-Argumenten.
Slice-Argument, das auf Slice-Typen beschränkt ist
Betrachten Sie die Funktion „slices.Grow“ mit das erste durch ~[]E eingeschränkte Argument. Das bedeutet, dass der Typ dieses Arguments ein Slice-Typ mit dem Elementtyp E sein muss.
Generisches Slice-Argument
Betrachten Sie dagegen die Funktion „slices.Contains“. wobei das erste Argument einfach als []E eingegeben wird. Dies ermöglicht jeden Slice-Typ mit einem Elementtyp von E.
Praktische Unterschiede
Anfangs scheint es, dass sich diese beiden Arten von Slice-Argumenten ähnlich verhalten, da sie Beide ermöglichen den Funktionen den Zugriff auf Slice-Operationen wie „Append“ und „Range“. Es gibt jedoch einen subtilen, aber wichtigen Unterschied, wenn es um die Rückgabe eines Slice geht.
Ein Slice zurückgeben
Wenn die Funktion die Rückgabe eines Slice desselben Typs erfordert Für den Eingabe-Slice müssen Sie ein Slice-Argument verwenden, das auf Slice-Typen beschränkt ist (~[]E). Dadurch wird sichergestellt, dass das zurückgegebene Slice den richtigen zugrunde liegenden Typ hat.
Beispiel
Vergleichen wir zwei Grow()-Implementierungen: eine mit ~[]E und die andere mit [ ]E.
func Grow[S ~[]E, E any](s S, n int) S {
// ...
}
func Grow2[E any](s []E, n int) []E {
// ...
}
Wenn wir ein Segment eines benutzerdefinierten Typs übergeben (z. B. []MyInt), kann Grow() einen Wert desselben Typs zurückgeben. Allerdings kann Grow2() nur einen generischen Slice-Typ ([]E) zurückgeben.
Fazit
Zusammenfassend: Wenn Sie ein Slice desselben zurückgeben müssen Wenn Sie den Typ als Eingabe-Slice verwenden möchten, müssen Sie ein Slice-Argument verwenden, das auf Slice-Typen beschränkt ist (~[]E). Andernfalls ist die Verwendung eines generischen Slice-Arguments ausreichend.
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