Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verändert die Änderung einer Go-Slice-Kopie auch das Original?

Warum verändert die Änderung einer Go-Slice-Kopie auch das Original?

Barbara Streisand
Barbara StreisandOriginal
2024-11-19 06:44:02216Durchsuche

Why Does Modifying a Go Slice Copy Also Change the 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:

  • Zeiger: Zeigt auf das Hintergrundarray, das die Daten enthält
  • Länge: Anzahl der Elemente im Slice
  • Kapazität: Maximale Kapazität des Slice

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn