Warum wirkt sich das Anhängen an ein Go-Slice nicht auf andere Slices aus, die auf dasselbe zugrunde liegende Array verweisen?

Patricia Arquette
Freigeben: 2024-11-15 00:43:02
Original
601 Leute haben es durchsucht

Why Doesn't Appending to a Go Slice Affect Other Slices Pointing to the Same Underlying Array?

Verstehen des Append-Verhaltens bei Slices

Problembeschreibung:

Bedenken Sie den folgenden Go-Code:

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slice1 := slice
    slice1[0] = 10000
    fmt.Println(slice)

    slice1 = append(slice1, 100)
    slice1[0] = 20000

    fmt.Println(slice)
}
Nach dem Login kopieren

Die anfängliche Ausgabe ist wie erwartet: Sowohl Slice als auch Slice1 zeigen die gleichen Werte. Nach dem Anhängevorgang für Slice1 bleiben die Werte von Slice jedoch unverändert. Dieses Verhalten erscheint angesichts der Annahme, dass Slices Zeiger sind, kontraintuitiv.

Erklärung:

Die Append-Funktion ändert Slice1 nicht. Go übergibt alle Werte nach Wert, sodass Slice1 eine Kopie von Slice erhält. Der Anhängevorgang erstellt ein neues Array, da das ursprüngliche Array seine Kapazität erreicht hat. Anschließend kopiert es den Inhalt des alten Arrays in das neue und gibt einen neuen Slice-Header zurück, der auf das neue Array zeigt.

Die Zuweisung des Rückgabewerts an Slice1 ändert Slice1. Slice bleibt jedoch davon unberührt, da es sich um eine separate Variable handelt, die auf das ursprüngliche Array zeigt. Daher werden alle Änderungen, die nach dem Anhängevorgang an den Elementen von Slice1 oder Slice vorgenommen werden, nicht in den anderen widergespiegelt.

Zusammenfassend lässt sich sagen, dass Slices in Go als Wert übergeben werden und durch Anhängen neue Slices mit new erstellt werden zugrunde liegende Arrays bei Bedarf. Dies bedeutet, dass an einem Slice vorgenommene Änderungen nicht in anderen Slices widergespiegelt werden, die auf das ursprüngliche Array verweisen.

Das obige ist der detaillierte Inhalt vonWarum wirkt sich das Anhängen an ein Go-Slice nicht auf andere Slices aus, die auf dasselbe zugrunde liegende Array verweisen?. 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