Heim > Backend-Entwicklung > Golang > Go Slices: Warum führt das Kopieren von Slice-Elementen mithilfe von „range' manchmal zu Shared-Memory-Adressen?

Go Slices: Warum führt das Kopieren von Slice-Elementen mithilfe von „range' manchmal zu Shared-Memory-Adressen?

Linda Hamilton
Freigeben: 2024-12-19 02:12:09
Original
487 Leute haben es durchsucht

Go Slices: Why Does Copying Slice Elements Using `range` Sometimes Lead to Shared Memory Addresses?

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

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