J'ai vu que cette plage renvoie la clé et la "copie" de la valeur. Existe-t-il un moyen pour cette plage de renvoyer l'adresse de l'article? Exemple
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
Ici, le "champ" n'est pas modifié car range envoie la copie du champ, dois-je utiliser l'index ou y a-t-il un autre moyen de modifier la valeur?
Merci d'avoir lu.
MyType
?range
fonctionne bien et il renvoie ce que vous avez mis dans la tranche. Ici, les valeurs de typeMyStruct
(qui est un type valeur) résident à l'intérieur de la tranche. Au lieu de cela, nous pourrions mettre des pointeurs de type*MyStruct
à l'intérieur de la tranche. Si vous en avez absolument besoin pour fonctionner tel quel, vous pouvez utiliser des index au lieu des valeurs renvoyées parrange
.Réponses:
La réponse courte et directe: non, utilisez l'index du tableau au lieu de la valeur
Ainsi, le code ci-dessus devient:
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("--") } }
la source
array[idx]
vous pourriez plutôt choisir d'avoire := &array[idx]
au sommet de la boucle, puis utilisere.field1
,e.field2
etc qui ressemble plus à l'OP aurait voulu (juste avec deux lignes au lieu d'un)., _
tout -for idx := range array
Cela a déjà été dit dans les commentaires, mais pour ceux qui recherchent des réponses tout de suite, voici comment obtenir le résultat attendu en utilisant une tranche de pointeurs et en apportant le moins de modifications au code d'origine.
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("--") } }
Le voici en terrain de jeu
la source
e := &array[idx]
intérieur de chaque plage qui ont ce pointeur vers un pointeur ...package 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("--") } }
la source