Heim >Backend-Entwicklung >Golang >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?

DDD
DDDOriginal
2024-10-24 04:23:02781Durchsuche

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

Erkundung 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 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.

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

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.

Beispiel

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.

Schlussfolgerung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn