Das Verhalten von Go-Slice-Bereichen verstehen
In Go sind Slices eine grundlegende Datenstruktur, die eine effiziente und dynamische Speicherung von Elementen ermöglicht. Bei der Arbeit mit Slices ist es wichtig, das Verhalten von Bereichsschleifen zu verstehen.
Beachten Sie den folgenden Codeausschnitt:
type student struct { Name string Age int } func main() { m := make(map[string]*student) s := []student{ {Name: "Allen", Age: 24}, {Name: "Tom", Age: 23}, } for _, stu := range s { m[stu.Name] = &stu } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } }
Der Code definiert ein Slice von Student-Strukturen und eine Karte. Es iteriert mithilfe einer Bereichsschleife über das Slice, wobei jedes Element der Variablen „stu“ zugewiesen wird. Das beobachtete unerwartete Verhalten besteht jedoch darin, dass alle Karteneinträge auf dieselbe Adresse innerhalb des Slice verweisen.
Ursache:
Das Problem hat seinen Ursprung in der Zuweisung der Bereichsschleife zur Variablen 'stu.' Wenn die Schleife iteriert, wird „stu“ eine Kopie des Slice-Elements an diesem Index zugewiesen. Infolgedessen verweisen alle Karteneinträge auf denselben kopierten Wert.
Lösung:
Um dieses Verhalten zu beheben, sollte der Code explizit die Adresse jedes Slice übernehmen Element, bevor es in der Karte gespeichert wird:
for i := range s { m[s[i].Name] = &s[i] }
Durch diese Änderung verweist jeder Karteneintrag nun auf die Adresse des tatsächlichen Slice-Elements und stellt so das erwartete Verhalten sicher. Dies zeigt, wie wichtig es ist, die Nuancen von Slice-Range-Schleifen zu verstehen und wie sie sich auf die Datenmanipulation in Go auswirken können.
Das obige ist der detaillierte Inhalt vonWie wirkt sich Gos Slice Range Loop auf die Adresszuweisung in Karten aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!