Heim > Backend-Entwicklung > Golang > Warum verändert das Anhängen an eine Go-Slice-Kopie das Original?

Warum verändert das Anhängen an eine Go-Slice-Kopie das Original?

Barbara Streisand
Freigeben: 2024-11-27 15:28:11
Original
172 Leute haben es durchsucht

Why Does Appending to a Go Slice Copy Change the Original?

Slice-Verhalten in Go verstehen: Warum ändert das Anhängen das ursprüngliche Slice?

Im bereitgestellten Code-Snippet haben wir eine Funktion someFunc, die arbeitet mit einem Segment von ganzen Zahlen. Innerhalb der Funktion wird ein temporäres Slice tempA erstellt und ihm der Wert des Eingabe-Slice A zugewiesen. Beim Anhängen an tempA wird jedoch auch das ursprüngliche A geändert. Dieses Verhalten mag kontraintuitiv erscheinen, also wollen wir untersuchen, warum es auftritt.

In Go werden Slices als Datentyp []T deklariert, wobei T den Elementtyp darstellt. Trotz seines Namens handelt es sich bei einem Slice nicht um eine Sammlung von Elementen, die zusammenhängend im Speicher gespeichert sind. Stattdessen handelt es sich um eine Header-Struktur, die die folgenden Informationen enthält:

  • Länge: Die Anzahl der Elemente im Slice
  • Kapazität: Die Anzahl der Elemente, die das zugrunde liegende Array aufnehmen kann
  • Zeiger: Ein Verweis auf das zugrunde liegende Array, in dem die Slice-Daten gespeichert sind

Wenn Sie den Wert einer Slice-Variablen zuweisen, ist dies nicht der Fall Kopieren des gesamten Arrays. Stattdessen erstellen Sie einen neuen Slice-Header, der auf dasselbe zugrunde liegende Array verweist. Wenn Sie also einen Vorgang wie das Anhängen an tempA ausführen, ändern Sie auch das zugrunde liegende Array und folglich die Werte im ursprünglichen Slice A.

Dieses Verhalten ist wichtig, um eine effiziente Speicherverwaltung sicherzustellen und unnötiges zu vermeiden Kopieren. Durch die Verwendung eines zeigerbasierten Ansatzes können Go-Slices dasselbe zugrunde liegende Array gemeinsam nutzen und gleichzeitig separate Längen- und Kapazitätswerte beibehalten. Dies ermöglicht einfache Änderungen an Slices, ohne dass teure Kopiervorgänge erforderlich sind.

Ein tieferes Verständnis des Slice-Verhaltens und der zugrunde liegenden Datenstrukturen finden Sie in der folgenden Ressource: https://blog.golang.org/ Scheiben

Das obige ist der detaillierte Inhalt vonWarum verändert das Anhängen an eine Go-Slice-Kopie das Original?. 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