Adressen anstelle von Werten für Bereichsreferenzen zurückgeben
Stellen Sie sich die Situation vor, in der eine Bereichsanweisung eine Kopie eines Werts anstelle der Originaladresse zurückgibt . Dies kann zu unerwartetem Verhalten führen, wie im folgenden Go-Code zu sehen ist:
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("--") } }
In diesem Beispiel besteht die Absicht darin, die „field“-Eigenschaft jedes Elements im Array zu ändern. Da die Range-Anweisung jedoch eine Kopie des Werts zurückgibt, werden die Änderungen an einer lokalen Kopie vorgenommen und wirken sich nicht auf das ursprüngliche Array aus. Als Ergebnis zeigt die Ausgabe, dass alle „Feld“-Eigenschaften den Standardwert haben.
Um dieses Problem zu beheben, können Sie die Adresse des Elements nicht in einer Bereichsschleife zurückgeben. Stattdessen sollten Sie das Array mithilfe des Index durchlaufen, wie unten gezeigt:
func main() { var array [10]MyType for idx, _ := range array { array[idx].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Durch die Verwendung des Index anstelle des Werts in der for-Schleife stellen Sie sicher, dass die an der Eigenschaft „field“ vorgenommenen Änderungen berücksichtigt werden werden im ursprünglichen Array widergespiegelt.
Das obige ist der detaillierte Inhalt vonWarum ändert meine Go-Range-Schleife keine Array-Elemente?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!