Warum erstellt das Kopieren eines Go-Slices keine tiefe Kopie und wie kann ich unbeabsichtigte Mutationen vermeiden?

Patricia Arquette
Freigeben: 2024-11-27 18:38:14
Original
499 Leute haben es durchsucht

Why Does Copying a Go Slice Not Create a Deep Copy, and How Can I Avoid Unintended Mutations?

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:]...)
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage