Heim > Artikel > Backend-Entwicklung > Warum verändert die Änderung einer Go-Slice-Kopie auch das Original?
Slice-Änderung in Go verstehen
In Go verhalten sich Slice-Variablen anders als typische Arrays. Dies kann zu unerwartetem Verhalten führen, insbesondere beim Ändern von Slices.
Das Geheimnis des sich ändernden Original-Slices
Beachten Sie den folgenden Code:
import "fmt" func main() { A := []int{3, 4, 5, 3, 7} fmt.Println("Initial slice: ", A) funcSome(A) fmt.Println("Modified slice: ", A) } func funcSome(slice []int) { fmt.Println("Inside function, original slice: ", slice) temp := slice // copy by value temp[0] = 10 fmt.Println("Inside function, modified temp: ", temp) fmt.Println("Inside function, original slice: ", slice) }
Wenn Sie diesen Code ausführen, werden Sie möglicherweise überrascht sein, dass durch die Änderung des temporären Slice „temp“ auch das ursprüngliche Slice geändert wird. A.
Eintauchen in die internen Strukturen von Slices
Um dieses Verhalten zu verstehen, müssen wir in die interne Struktur von Slices eintauchen. Eine Slice-Variable besteht aus drei Komponenten:
Wenn Sie ein Slice einer neuen Variablen nach Wert zuweisen, wie wir es mit temp := Slice tun, sind Sie es Erstellen einer flachen Kopie. Dies bedeutet, dass das neue Slice (temp) dasselbe Backing-Array und denselben Zeiger wie das ursprüngliche Slice (Slice) verwendet.
Das append()-Dilemma
Das append( )-Funktion in Go fügt Elemente zu einem Slice hinzu, indem sie ein neues Hintergrundarray erstellt und die vorhandenen Daten hinein kopiert. Wenn die Kapazität des neuen Slice jedoch nicht ausreicht, erhöht die Funktion „append()“ automatisch die Kapazität, indem sie ein größeres Backing-Array neu zuweist.
In Ihrem Beispiel verwendet die Funktion „remove()“ append(), um ein neues zu erstellen Scheibe. Da temp und A dasselbe Backing-Array verwenden, wirkt sich jede Änderung am neuen Slice auch auf das ursprüngliche Slice aus.
Fazit
Um die Slice-Änderung in Go zu verstehen, sind Kenntnisse erforderlich seine einzigartige innere Struktur. Denken Sie daran, dass Sie beim Kopieren von Slices nach Wert eine flache Kopie erstellen, die dasselbe Hintergrundarray verwendet. Dieses Verhalten kann beim Ändern von Slices zu unerwarteten Konsequenzen führen.
Das obige ist der detaillierte Inhalt vonWarum verändert die Änderung einer Go-Slice-Kopie auch das Original?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!