Generische Slice-Argumente vs. Slice-Typ-Einschränkungen
Im experimentellen Slices-Paket von Go akzeptieren zwei Funktionen, „Contains“ und „Grow“, Argumente mit unterschiedlichem Typ Einschränkungen. Contains nimmt den generischen Typ []E an, während Grow seinen Argumenttyp auf ein Slice (~[]E) beschränkt.
Typbeschränkungen
Eine Typbeschränkung, Mit ~ bezeichnet stellt sicher, dass ein Typ einer bestimmten Schnittstelle oder einem bestimmten Regelsatz entspricht. In Grow erzwingt die Einschränkung ~[]E, dass der Argumenttyp letztendlich ein Slice mit Elementtyp E sein muss.
Äquivalente Funktionalität?
Trotz der unterschiedlichen Typbeschränkungen , scheinen die in beiden Funktionen verfügbaren Vorgänge nahezu identisch zu sein. Ein wesentlicher praktischer Unterschied ergibt sich jedoch, wenn Funktionen ein Segment desselben Typs wie das Eingabeargument zurückgeben müssen.
Slices zurückgeben
Beim Zurückgeben eines Segments desselben Typs Als Eingabe ist es wichtig, eine Typbeschränkung wie ~[]E zu verwenden. Dadurch kann die Funktion den benannten Typ des Eingabe-Slice beibehalten.
Betrachten Sie zwei Versionen von Grow():
// Preserves named type func Grow[S ~[]E, E any](s S, n int) S {...} // Returns unnamed type func Grow2[E any](s []E, n int) []E {...}
Wenn Grow() einen benutzerdefinierten Slice-Typ empfängt, kann er zurückkehren ein Slice desselben Typs, während Grow2() immer ein unbenanntes Slice zurückgibt.
Demonstration
type MyInts []int x := MyInts{1} // Custom slice type x2 := Grow(x, 10) // Type preserved x3 := Grow2(x, 10) // Unnamed type
In diesem Beispiel ist x2 ein Slice von Geben Sie MyInts ein, während x3 ein unbenanntes Slice ist.
Fazit
Wenn Sie den benannten Typ eines Eingabe-Slices im Rückgabewert beibehalten müssen, ist dies erforderlich um eine Typbeschränkung wie ~[]E zu verwenden. Andernfalls ist das zurückgegebene Slice immer ein unbenannter Typ.
Das obige ist der detaillierte Inhalt vonWie wirken sich Slice-Einschränkungen auf die Typerhaltung aus, wenn Slices von Funktionen zurückgegeben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!