Heim >Backend-Entwicklung >Golang >Warum wird durch das Anhängen an eine Slice-Kopie in Go manchmal das Original geändert?

Warum wird durch das Anhängen an eine Slice-Kopie in Go manchmal das Original geändert?

DDD
DDDOriginal
2024-12-01 12:15:13404Durchsuche

Why Does Appending to a Slice Copy in Go Sometimes Modify the Original?

Warum ändern Slice-Anhänge das ursprüngliche Slice in Go?

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:

  • Slices sind Header-Objekte, die einen Abschnitt eines zugrunde liegenden Arrays beschreiben.
  • Beim Kopieren eines Slice wird der Header kopiert, das zugrunde liegende Array jedoch nicht.
  • Wenn zwei Slices denselben Header teilen, verweisen sie auf dasselbe zugrunde liegende Array und Änderungen, die an einem Slice vorgenommen werden, wirken sich auf das andere aus.

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!

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