Slice-Veränderlichkeit in Go verstehen
In Go ist ein Slice eine Variable mit dynamischer Größe, die eine zusammenhängende Folge von Elementen speichert. Es wird mithilfe einer Header-Struktur implementiert, die die Länge und einen Zeiger auf das zugrunde liegende Array speichert, das die Elemente enthält.
Betrachten Sie den folgenden Codeausschnitt:
func someFunc(A []int) int { ... tempA := A // copy the slice by value ... newArr = remove(tempA, i) ... } func remove(slice []int, s int) []int { return append(slice[:s], slice[s+1:]...) }
In diesem Code die Append-Funktion wird verwendet, um das tempA-Slice zu ändern. Wenn jedoch die someFunc-Funktion zurückkehrt, wird auch das ursprüngliche A-Slice geändert, obwohl tempA als Kopie von A erstellt wurde.
Warum passiert das?
Ein Slice-Header ist eine vom zugrunde liegenden Array getrennte Datenstruktur. Beim Kopieren eines Slice wird nur der Header kopiert, nicht das zugrunde liegende Array. Das bedeutet, dass das ursprüngliche A-Slice und das neu erstellte tempA-Slice beide auf dasselbe zugrunde liegende Array verweisen.
Wenn die Append-Funktion aufgerufen wird, wird ein neues Slice erstellt und die Elemente des tempA-Slices werden in das kopiert neues Stück. Das A-Slice zeigt jedoch immer noch auf dasselbe zugrunde liegende Array, das jetzt die geänderten Elemente enthält.
Empfehlung
Um unbeabsichtigte Mutationen des ursprünglichen Slice beim Ändern von a zu vermeiden Zum Kopieren sollten Sie die Kopierfunktion verwenden, um eine tiefe Kopie des Slice zu erstellen. Die Kopierfunktion erstellt ein neues zugrunde liegendes Array und kopiert die Elemente hinein.
Hier ist ein Beispiel für die Verwendung der Kopierfunktion:
tempA := make([]int, len(A)) copy(tempA, A)
Dadurch wird ein neues zugrunde liegendes Array erstellt tempA und kopieren Sie die Elemente von A hinein. Alle an tempA vorgenommenen Änderungen wirken sich nicht auf das ursprüngliche A-Slice aus.
Das obige ist der detaillierte Inhalt vonWarum erstellt das Kopieren eines Go-Slices keine tiefe Kopie und wie kann ich unbeabsichtigte Mutationen vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!