Verstehen des Verhaltens von Append() bei Slices
Beim Arbeiten mit Slices in Go ist es wichtig zu verstehen, wie die Funktion append() mit interagiert Slices, die als Wert übergeben werden.
Betrachten Sie den folgenden Codeausschnitt:
func main() {
slice := make([]int, 10, 10)
slice[0] = 0
slice[1] = 1
slice1 := slice
slice1[0] = 10000
fmt.Println(slice)
slice1 = append(slice1, 100)
slice1[0] = 20000
fmt.Println(slice)
}
Nach dem Login kopieren
In diesem Beispiel werden zwei Slices (Slice und Slice1) erstellt, wobei Slice1 zunächst auf dasselbe Array wie Slice zeigt . Allerdings wird Slice1 nach dem ersten append()-Aufruf ein neuer Slice-Wert zugewiesen, der auf ein anderes Array zeigt. Diese Zuweisung führt dazu, dass das Verhalten von Slice1 unabhängig vom Slice ist.
Erklärung:
-
Wertübergabe: In Go wird alles übergeben nach Wert, was bedeutet, dass Slice1 eine Kopie des Slice-Headers des Slice erhält.
-
Mit Kapazität anhängen: Beim Anhängen von mehr als 0 Elementen an ein Slice mit einer Kapazität, die seiner Länge entspricht (wie hier). Fall) wird ein neues, größeres Array zugewiesen.
-
Slice-Header-Zuweisung: Der append()-Aufruf gibt einen neuen Slice-Header zurück, der auf das neue Array zeigt, das Slice1 zugewiesen ist.
-
Unabhängige Slices:Nach der Zuweisung werden Slice und Slice1 zu zwei unterschiedlichen Variablen, die auf unterschiedliche Slice-Header und damit unterschiedliche Arrays verweisen.
Konsequenzen :
-
Unveränderlichkeit: Änderungen an Elementen in einem Slice (z. B. Slice1) werden nicht im anderen Slice (z. B. Slice) widergespiegelt.
-
Speicherverwaltung: Anhängevorgänge können zu einer Neuzuweisung von Speicher führen, neue Arrays erstellen und möglicherweise die Leistung beeinträchtigen.
Um Slice-Header und ihre Interna zu verstehen, lesen Sie die folgenden Ressourcen :
- [Werden Golang-Slices nach Wert übergeben?](https://stackoverflow.com/questions/25740338/are-golang-slices-pass-by-value)
- [Go Slices: Verwendung und Interna](https://blog.golang.org/slices)
Das obige ist der detaillierte Inhalt vonWie wirkt sich die Funktion „append()' von Go auf das Slice-Verhalten aus, wenn sie als Wert übergeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!