Adresses de retour au lieu de valeurs pour les références de plage
Considérez la situation où une instruction Range 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é "champ" 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. En conséquence, la sortie affiche toutes les propriétés "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 itérer dans 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ées dans le tableau d'origine.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3