Verwenden von Array-Indizes zur Elementänderung anstelle von Bereichswerten
Bei der Go-Programmierung iteriert das Schlüsselwort „range“ über eine Sammlung und gibt sowohl den Schlüssel zurück und die Kopie des Werts für jedes Element. Dieses Verhalten kann die Wertänderung innerhalb der Schleife behindern. Das folgende Beispiel veranschaulicht dieses Problem:
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType // Attempt to modify field using range values: for _, e := range array { e.field = "foo" } // Verify that field hasn't been modified: for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
In diesem Code versuchen wir, das Feld jedes Elements im Array mithilfe einer Bereichsschleife zu ändern. Da der Bereich jedoch eine Kopie des Werts zurückgibt, bleiben die tatsächlichen Elemente im Array unverändert. Dies führt dazu, dass alle Feldwerte leer bleiben.
Lösung: Array-Indizes verwenden
Um dieses Problem zu umgehen und die tatsächlichen Elemente zu ändern, sollten Sie stattdessen Array-Indizes verwenden die von der Bereichsschleife zurückgegebenen Werte. Hier ist der geänderte Code:
import "fmt" type MyType struct { field string } func main() { var array [10]MyType // Modify field using array indices: for idx, _ := range array { array[idx].field = "foo" } // Verify that field has been modified: for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Durch die Verwendung des Index jedes Elements anstelle des Werts können wir direkt auf die tatsächlichen Elemente im Array zugreifen und diese ändern. Dadurch wird sichergestellt, dass die Feldwerte korrekt aktualisiert werden.
Das obige ist der detaillierte Inhalt vonWarum können Array-Elemente durch die Verwendung des Range-Schlüsselworts von Go nicht geändert werden, 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!