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) } }
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!