Heim > Backend-Entwicklung > Golang > Warum werden beim Kopieren von einem Go-Slice mit einer Bereichsschleife manchmal Speicheradressen dupliziert?

Warum werden beim Kopieren von einem Go-Slice mit einer Bereichsschleife manchmal Speicheradressen dupliziert?

Linda Hamilton
Freigeben: 2024-12-23 19:17:15
Original
947 Leute haben es durchsucht

Why Does Copying from a Go Slice with a Range Loop Sometimes Duplicate Memory Addresses?

Wiederverwendung der Speicheradresse beim Kopieren aus einem Slice in Go

Sie sind in Go auf ein eigenartiges Verhalten gestoßen, bei dem Werte aus einem Slice mithilfe eines Bereichs kopiert wurden Die Schleife führte zu doppelten Speicheradressen in der Ausgabe. Um dieses Problem zu beheben, haben Sie den Code geändert, um eine temporäre Variable zu erstellen, die die erwarteten eindeutigen Adressen erzeugt.

Dieses Verhalten entsteht, weil im Originalcode das Schleifenvariablenelement ein Zeiger auf das aktuelle Element des Slice ist . Während Sie das Slice durchlaufen, verwendet Go diese Zeigervariable wieder und ändert ihren Wert bei jeder Iteration, behält aber dieselbe Speicheradresse bei. Wenn Sie also &item dem Ausgabe-Slice zuweisen, duplizieren Sie versehentlich dieselbe Speicheradresse mehrmals.

Um diese Wiederverwendung zu verhindern, erstellt Ihr geänderter Code eine temporäre Variable i, die eine Kopie des aktuellen Elements enthält. Dies zwingt Go dazu, für jede Iteration eine neue Speicherzuweisung zu erstellen, was zu eindeutigen Adressen im Ausgabe-Slice führt.

Um dieses Konzept zu veranschaulichen, betrachten Sie das folgende Beispiel:

package main

import "fmt"

type Region struct {
    Name string
}

func main() {
    // Create a slice of Region objects.
    regions := []Region{
        {Name: "Central"},
        {Name: "East"},
    }

    // Original code - duplicates memory addresses
    fmt.Println("Original Code:")
    models1 := make([]Model, len(regions))
    for idx, item := range regions {
        models1[idx] = &item
    }
    for _, m := range models1 {
        fmt.Println(m)
    }

    // Modified code - generates unique memory addresses
    fmt.Println("Modified Code:")
    models2 := make([]Model, len(regions))
    for idx, _ := range regions {
        i := regions[idx]
        models2[idx] = &i
    }
    for _, m := range models2 {
        fmt.Println(m)
    }
}
Nach dem Login kopieren

Ausführen dieses Codes , werden Sie feststellen, dass der ursprüngliche Code doppelte Speicheradressen druckt, während der geänderte Code eindeutige Adressen erzeugt.

Das obige ist der detaillierte Inhalt vonWarum werden beim Kopieren von einem Go-Slice mit einer Bereichsschleife manchmal Speicheradressen dupliziert?. 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