Eintauchen in das Go-Slice-Range-Phänomen
Im bereitgestellten Code-Snippet wird ein Teil der Schülerstrukturen mithilfe des Schlüsselworts „range“ iteriert. Die Zuordnung von Studentenadressen zu einer Karte offenbart jedoch ein scheinbar verwirrendes Problem: Die resultierenden Kartenschlüssel haben dieselbe Adresse.
Um dieses Phänomen zu verstehen, ist es wichtig zu erkennen, dass in Go das Schlüsselwort „range“ über iteriert Elemente eines Slice, nicht die Adressen. Das bedeutet, dass die Variable stu innerhalb der Range-Schleife eine Kopie des Slice-Elements ist. Wenn also die Adresse von stu genommen und einem Kartenschlüssel zugewiesen wird, wird die Adresse der Kopie und nicht das Slice-Element gespeichert.
Um dies zu beheben, muss man den Code ändern, um das explizit zu übernehmen Adresse des Slice-Elements. Dies kann durch die Verwendung der Slice-Indexvariablen i erreicht werden:
for i := range s { m[s[i].Name] = &s[i] }
Diese Modifikation stellt sicher, dass die Map-Schlüssel die Adressen der tatsächlichen Slice-Elemente enthalten.
Durch das Verständnis des Unterschieds zwischen Iterieren über Mithilfe der Slice-Elemente und der Übernahme ihrer Adressen können Entwickler potenzielle Verwirrung vermeiden und das beabsichtigte Verhalten ihres Codes sicherstellen, wenn sie in Go mit Slices arbeiten.
Das obige ist der detaillierte Inhalt vonWarum weisen Go-Slice-Bereichsschleifen den Zuordnungsschlüsseln dieselbe Adresse zu, wenn sie „&stu' verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!