Das Slice-Range-Phänomen in Go verstehen
In Go kann das Verhalten von Slice-Bereichen verwirrend sein. Wenn man mit einer Range-Klausel über einen Slice iteriert, ist man versucht zu glauben, dass die Iterationsvariable die Adresse jedes Elements enthält. Dies ist jedoch nicht immer der Fall. Ein solches Szenario ist die Arbeit mit Strukturen und Karten.
Betrachten Sie den folgenden Code:
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 } }
Dieser Code iteriert über ein Segment von Strukturen und fügt einer Karte ein Schlüssel-Wert-Paar hinzu jede Struktur und speichert die Adresse der Struktur als Wert. Die resultierende Karte zeigt jedoch, dass alle Werte auf dieselbe Adresse verweisen.
Um dieses Phänomen zu erklären, müssen wir uns die zugrunde liegende Implementierung von Slice-Bereichen ansehen. Wenn ein Slice mithilfe einer Range-Klausel iteriert wird, erhält die Iterationsvariable eine Kopie des Elements aus dem Slice. Somit enthält die Iterationsvariable eine Kopie der Struktur, nicht ihre Adresse.
Um dieses Problem zu beheben und die Adresse der Struktur in der Karte zu speichern, muss der Code geändert werden, um die Adresse des Slice-Elements zu übernehmen :
for i := range s { m[s[i].Name] = &s[i] }
Diese Änderung stellt sicher, dass die Iterationsvariable die Adresse der Struktur enthält und die Karte die Adressen jeder Struktur im Slice korrekt speichert.
Das obige ist der detaillierte Inhalt vonWarum geben Slice-Bereichsiterationen in Go manchmal Kopien anstelle von Adressen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!