Adresses de retour au lieu de valeurs pour les références de plage
Considérez la situation dans laquelle une instruction de plage renvoie une copie d'une valeur au lieu de l'adresse d'origine . Cela peut conduire à un comportement inattendu, comme le montre le code Go suivant :
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("--") } }
Dans cet exemple, l'intention est de modifier la propriété "field" de chaque élément du tableau. Cependant, puisque l'instruction range renvoie une copie de la valeur, les modifications sont apportées à une copie locale et n'affectent pas le tableau d'origine. Par conséquent, la sortie affiche toutes les propriétés de « champ » comme ayant la valeur par défaut.
Pour résoudre ce problème, vous ne pouvez pas renvoyer l'adresse de l'élément dans une boucle de plage. Au lieu de cela, vous devez parcourir le tableau à l'aide de l'index, comme indiqué ci-dessous :
func main() { var array [10]MyType for idx, _ := range array { array[idx].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
En utilisant l'index au lieu de la valeur dans la boucle for, vous vous assurez que les modifications apportées à la propriété "field" sont reflétés dans le tableau d'origine.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!