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 vergleichbar 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
Bei der Übergabe Grow ist ein Slice eines benutzerdefinierten Typs mit einem Slice als zugrunde liegendem Typ. 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
Hier empfängt Grow2(y, 10) einen Wert vom Typ ints, gibt aber einen Wert zurück vom Typ []int, was nicht das beabsichtigte Verhalten ist.
Zusammenfassend lässt sich sagen, dass, wenn der Funktionsaufruf die Rückgabe eines Slice desselben (möglicherweise benannten) Typs wie das Argument erfordert, using Es ist ein Typparameter erforderlich, der selbst auf ein Slice (~[]E) beschränkt. Andernfalls kann ein Typparameter verwendet werden, der nur den Elementtyp (E beliebig) einschränkt.
Das obige ist der detaillierte Inhalt vonWann sollte ~[]E vs. []E für Slice-Argumente in Go verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!