Heim > Backend-Entwicklung > Golang > Warum führt das Kopieren von einem Go-Slice zur Wiederverwendung von Speicheradressen und wie kann dies behoben werden?

Warum führt das Kopieren von einem Go-Slice zur Wiederverwendung von Speicheradressen und wie kann dies behoben werden?

Barbara Streisand
Freigeben: 2024-12-25 21:34:11
Original
391 Leute haben es durchsucht

Why Does Copying from a Go Slice Result in Memory Address Reuse, and How Can It Be Fixed?

Wiederverwendung von Speicheradressen beim Kopieren aus Golang-Slices

Ein häufiges Missverständnis bei der Go-Programmierung dreht sich um das Kopieren von Speicheradressen aus Slices. Stellen Sie sich die folgende Situation vor:

Sie haben eine Model-Schnittstelle und eine Region-Struktur, die sie implementiert. Die Schnittstelle wird auf dem Zeiger der Region-Struktur implementiert. Sie verfügen außerdem über eine Regions-Sammlung, bei der es sich um einen Ausschnitt aus Region-Objekten handelt. Sie verfügen über eine Methode zum Konvertieren eines Regions-Objekts in ein []Modell:

// 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

Wenn Sie diesen Code ausführen, würden Sie erwarten, dass Sie für jedes Modell im Ausgabe-Slice unterschiedliche Adressen erhalten. Am Ende wird jedoch der erste Zeiger auf die Region mehrmals ausgegeben.

Um dieses Problem zu beheben, betrachten Sie das Schleifenvariablenelement in der ursprünglichen Methode. Es ist für jede Iteration der Schleife dasselbe, sodass das resultierende Slice Verweise auf dieselben zugrunde liegenden Daten enthält.

Die Arbeitslösung hingegen verwendet i := (*coll)[idx] to Erstellen Sie für jede Iteration eine neue Variable. Dadurch wird sichergestellt, dass jedes Modell im Ausgabe-Slice eine eindeutige Speicheradresse hat.

Zum besseren Verständnis betrachten Sie den folgenden Codeausschnitt:

func main() {
    coll := []int{5, 10, 15}

    for i, v := range coll {
        fmt.Printf("This one is always the same; %v\n", &v)
        fmt.Println("This one is 4 bytes larger each iteration; %v\n", &coll[i])
    }
}
Nach dem Login kopieren

Dieser Code zeigt, dass die Speicheradresse von v bleibt während der gesamten Schleife gleich, während die Speicheradresse von coll[i] mit jeder Iteration zunimmt. Dieses Verhalten ist darauf zurückzuführen, dass v die Schleifenvariable ist, die konstant bleibt, während coll[i] für jede Iteration eine neue Variable ist.

Das obige ist der detaillierte Inhalt vonWarum führt das Kopieren von einem Go-Slice zur Wiederverwendung von Speicheradressen und wie kann dies behoben werden?. 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