Die Verwendung von Array-Indizes über Bereichswerte
Bei der Verwendung des Schlüsselworts „range“ mit Arrays oder Slices in Go ist es wichtig, dies zu verstehen gibt den Schlüssel und eine Kopie des Werts zurück, nicht die ursprüngliche Wertreferenz. Dieses Verhalten kann zu Verwirrung führen, wenn versucht wird, Werte innerhalb der Sammlung während der Iteration zu ändern.
Im bereitgestellten Beispiel:
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Es wird erwartet, dass die Bereichsiteration die Zeichenfolge „foo“ zuweist das Feld jedes Elements im Array. Wenn jedoch die zweite Schleife die aktualisierten Werte ausgibt, bleiben alle Felder leer. Dies liegt an der kopierbasierten Semantik des Bereichs.
Um die Werte innerhalb des Arrays während der Iteration effektiv zu ändern, ist es notwendig, den Array-Index anstelle der Bereichsvariablen zu verwenden:
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for idx, _ := range array { array[idx].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Diese Änderung stellt sicher, dass die Indexvariable auf das tatsächliche Element im Array verweist, was ordnungsgemäße Feldaktualisierungen und eine korrekte Ausgabe in der zweiten Schleife ermöglicht.
Das obige ist der detaillierte Inhalt vonWarum schlägt das Ändern von Werten mit dem Schlüsselwort „range' von Go fehl und wie können Array-Indizes eine Lösung bieten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!