Heim >Backend-Entwicklung >Golang >Warum wird durch das Anhängen an eine Slice-Kopie in Go manchmal das Original geändert?
In Go hängt die integrierte Anhängefunktion Elemente an ein Slice an, indem sie ein neues zugrunde liegendes Array erstellt. Kopieren der vorhandenen Elemente und Anhängen der neuen Elemente. Wenn das ursprüngliche Slice und das in der Append-Funktion verwendete Slice dasselbe zugrunde liegende Array verwenden, werden an einem der Slice vorgenommene Änderungen in beiden widergespiegelt.
Beachten 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:]...) }
Hier nimmt die someFunc-Funktion ein Slice A und erstellt eine Kopie davon namens tempA. Die Remove-Funktion führt dann die Append-Funktion auf tempA aus, um das Element am Index s zu entfernen.
Da das tempA-Slice ursprünglich auf dasselbe zugrunde liegende Array wie A verweist, gelten dies auch für die an tempA (über die Append-Funktion) vorgenommenen Änderungen spiegelt sich in A wider. Dies liegt daran, dass die Append-Funktion ein neues zugrunde liegendes Array erstellt und die vorhandenen Elemente hinein kopiert. Da A und tempA dasselbe zugrunde liegende Array nutzen, werden alle an einem vorgenommenen Änderungen auch an das andere weitergegeben.
Dieses Verhalten wird in Go aufgrund der Art und Weise erwartet, wie Slices intern implementiert werden:
Um dieses gemeinsame Referenzverhalten zu vermeiden, können Sie Folgendes tun Erstellen Sie ein neues Slice und kopieren Sie die Elemente explizit wie folgt:
tempA := make([]int, len(A)) copy(tempA, A)
Das obige ist der detaillierte Inhalt vonWarum wird durch das Anhängen an eine Slice-Kopie in Go manchmal das Original geändert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!