Bereichsreferenzen statt Werte
In Go iteriert das Schlüsselwort „range“ über eine Sequenz, beispielsweise ein Array oder ein Slice, und bietet Zugriff sowohl auf den Schlüssel (Index) als auch auf den Wert jedes Elements. Aus Leistungsgründen arbeitet das Schlüsselwort „range“ jedoch mit einer Kopie des Originalwerts. Dies bedeutet, dass alle Änderungen, die am von range zurückgegebenen Wert vorgenommen werden, nicht im ursprünglichen Array widergespiegelt werden.
Beispiel
Bedenken Sie den folgenden Code:
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType // Attempting to modify a value returned by range for _, e := range array { e.field = "foo" } // Printing the values after the range loop for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Beim Ausführen dieses Codes wird „000000“ für alle Elemente ausgegeben, da die an e.field innerhalb der ersten Bereichsschleife vorgenommenen Änderungen auf a angewendet werden kopieren und den ursprünglichen Wert im Array nicht beeinflussen.
Lösung
Um die Werte eines Arrays mithilfe einer Bereichsschleife zu ändern, müssen Sie Array-Index anstelle des vom Bereich zurückgegebenen Werts. Dies kann erreicht werden, indem der Index mithilfe des Platzhalters _ in der Bereichsschleife erfasst wird.
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType // Using the array index to modify values for idx, _ := range array { array[idx].field = "foo" } // Printing the values after the range loop for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Das obige ist der detaillierte Inhalt vonWarum ändert das Ändern von Werten in der Bereichsschleife von Go nicht das ursprüngliche Array?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!