Go: Speicheradressenkopie aus Slice wiederverwenden
In Go iteriert die Bereichsfunktion über Elemente eines Slice. Eine häufige Gefahr besteht jedoch in der Wiederverwendung von Speicheradressen für Schleifenvariablen. Dies kann zu unerwarteten Ergebnissen führen, wenn versucht wird, Slice-Elemente in eine andere Datenstruktur zu kopieren.
Beachten Sie den folgenden Codeausschnitt:
// Regions is the collection of the Region model type Regions []Region // Returns the model collection as a list of models func (coll *Regions) ToModelList() []Model { output := make([]Model, len(*coll)) for idx, item := range *coll { output[idx] = &item } return output }
In diesem Code ist das Schleifenvariablenelement eine Zeigerreferenz zu einem Element im *col-Slice. Durch die Zuweisung von &item zu den Elementen des Ausgabe-Slices verweisen mehrere Elemente letztendlich auf dasselbe zugrunde liegende Region-Objekt. Dies liegt daran, dass Ausgabe und *Coll die gleiche Speicheradresse für das Element haben.
Um dieses Problem zu beheben, muss für jedes Element in der Ausgabe eine eindeutige Kopie des Region-Objekts erstellt werden. Dies kann durch die Verwendung des folgenden Codeausschnitts erreicht werden:
// Returns the model collection as a list of models func (coll *Regions) ToModelList() []Model { output := make([]Model, len(*coll)) for idx, _ := range *coll { i := (*coll)[idx] output[idx] = &i } return output }
In diesem überarbeiteten Code wird _ als Schleifenvariable für den Bereich über *colll verwendet. Dadurch wird sichergestellt, dass für jede Iteration eine neue Kopie von i erstellt wird, wodurch die Wiederverwendung von Speicheradressen über Schleifeniterationen hinweg verhindert wird.
Das Verständnis der Nuancen der Speicherverwaltung von Go ist entscheidend, um solche Fallstricke zu vermeiden und eine korrekte Programmausführung sicherzustellen .
Das obige ist der detaillierte Inhalt vonGo Slices: Warum führt das Kopieren von Slice-Elementen mithilfe von „range' manchmal zu Shared-Memory-Adressen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!