Ich habe gesehen, dass der Bereich den Schlüssel und die "Kopie" des Werts zurückgibt. Gibt es eine Möglichkeit für diesen Bereich, die Adresse des Artikels zurückzugeben? 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("--")
}
}
http://play.golang.org/p/AFOGG9NGpx
Hier wird "Feld" nicht geändert, da der Bereich die Kopie des Felds sendet. Muss ich einen Index verwenden oder gibt es eine andere Möglichkeit, den Wert zu ändern?
Danke fürs Lesen.
MyType
?range
funktioniert einwandfrei und gibt zurück, was Sie in das Slice eingefügt haben. Hier befinden sich Werte vom TypMyStruct
(bei denen es sich um einen Werttyp handelt) innerhalb des Slice. Stattdessen könnten wir Zeiger vom Typ*MyStruct
in das Slice einfügen. Wenn Sie es unbedingt benötigen, um so zu funktionieren, wie es ist, können Sie Indizes anstelle der von zurückgegebenen Werte verwendenrange
.Antworten:
Die kurze und direkte Antwort: Nein, verwenden Sie den Array-Index anstelle des Werts
So wird der obige Code:
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("--") } }
quelle
array[idx]
könnten Sie stattdessen wählen habene := &array[idx]
an der Spitze der for - Schleife und dann verwendene.field1
,e.field2
usw. , die näher der OP ähneln vielleicht gewünscht hat (nur mit zwei Linien statt eins)., _
vollständig fallen lassen -for idx := range array
Es wurde bereits in den Kommentaren gesagt, aber für diejenigen, die sofort nach Antworten suchen, ist hier, wie Sie das erwartete Ergebnis erzielen können, indem Sie ein Stück Zeiger verwenden und die geringsten Änderungen am Originalcode vornehmen.
package main import "fmt" type MyType struct { field string } func main() { // Slice of pointers instead of slice of type var array [10]*MyType // Initialize array manually for idx := range array { array[idx] = &MyType{} } for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Hier ist es auf dem Spielplatz
quelle
e := &array[idx]
in jedem Bereich, der diesen Zeiger hat, einen Zeigerpackage main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for index := range array { array[index].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
quelle