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:
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!