Problembeschreibung:
Bedenken Sie den folgenden Go-Code:
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) }
Die anfängliche Ausgabe ist wie erwartet: Sowohl Slice als auch Slice1 zeigen die gleichen Werte. Nach dem Anhängevorgang für Slice1 bleiben die Werte von Slice jedoch unverändert. Dieses Verhalten erscheint angesichts der Annahme, dass Slices Zeiger sind, kontraintuitiv.
Erklärung:
Die Append-Funktion ändert Slice1 nicht. Go übergibt alle Werte nach Wert, sodass Slice1 eine Kopie von Slice erhält. Der Anhängevorgang erstellt ein neues Array, da das ursprüngliche Array seine Kapazität erreicht hat. Anschließend kopiert es den Inhalt des alten Arrays in das neue und gibt einen neuen Slice-Header zurück, der auf das neue Array zeigt.
Die Zuweisung des Rückgabewerts an Slice1 ändert Slice1. Slice bleibt jedoch davon unberührt, da es sich um eine separate Variable handelt, die auf das ursprüngliche Array zeigt. Daher werden alle Änderungen, die nach dem Anhängevorgang an den Elementen von Slice1 oder Slice vorgenommen werden, nicht in den anderen widergespiegelt.
Zusammenfassend lässt sich sagen, dass Slices in Go als Wert übergeben werden und durch Anhängen neue Slices mit new erstellt werden zugrunde liegende Arrays bei Bedarf. Dies bedeutet, dass an einem Slice vorgenommene Änderungen nicht in anderen Slices widergespiegelt werden, die auf das ursprüngliche Array verweisen.
Das obige ist der detaillierte Inhalt vonWarum wirkt sich das Anhängen an ein Go-Slice nicht auf andere Slices aus, die auf dasselbe zugrunde liegende Array verweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!