Betrachten Sie zwei Funktionen aus dem experimentellen Slices-Paket: Contains und Grow. Beide Funktionen akzeptieren Slice-Argumente, jedoch mit unterschiedlichen 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.
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.
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.
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.
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.
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.
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