Maison > développement back-end > Golang > Pourquoi les boucles For de Golang produisent-elles des sorties différentes lors de l'utilisation de fermetures ?

Pourquoi les boucles For de Golang produisent-elles des sorties différentes lors de l'utilisation de fermetures ?

DDD
Libérer: 2024-12-14 19:42:17
original
412 Les gens l'ont consulté

Why Do Golang's For Loops Produce Different Outputs When Using Closures?

Comprendre le comportement des boucles disparates dans Golang

Dans ce code, nous créons deux boucles for (loop1 et loop2) qui parcourent une tranche de chaînes (cmds). Cependant, le résultat résultant de ces boucles diffère.

Boucle 1 : sortie inattendue

Dans la boucle 1, après avoir itéré sur cmds, une carte (actions) est créée où chaque commande est mappée à une fonction qui imprime la commande. Lorsque ces fonctions sont exécutées, elles impriment toutes "update", qui est le dernier élément de cmds.

Boucle 2 : sortie souhaitée

Dans la boucle 2, une approche similaire est adoptée, mais au lieu de stocker références directes aux commandes dans la carte des actions, une copie de la commande est réalisée à l'aide de son index. Cela garantit que chaque fonction possède sa propre copie de la commande, empêchant ainsi la sortie inattendue de "mise à jour" de la boucle1.

Explication

Le comportement particulier de la boucle1 se produit en raison de la façon dont les fermetures (fonctions stockées dans la carte des actions) référence les variables de boucle.

  • Dans la boucle1, cmd est une variable de boucle qui est modifiée à chaque itération. Lorsque des fonctions sont créées dans la boucle, elles font référence à cette variable de boucle.
  • Cependant, une fois la boucle terminée, la variable de boucle cmd n'est plus accessible et toutes les fonctions font référence à la dernière valeur qu'elle contenait ("mise à jour" ).

En faisant une copie de la variable de boucle pour chaque fonction (comme dans loop2), chaque fonction possède sa propre variable isolée qui n'est pas affectée par la boucle suivante itérations.

Conclusion

Cet exemple met en évidence l'importance de la portée des variables dans Golang et la distinction entre les variables de boucle et les variables détachées créées par copie. Lorsque vous travaillez avec des fermetures faisant référence à des variables de boucle, il est crucial de s'assurer que des copies sont effectuées pour éviter tout comportement inattendu dû à la réutilisation des variables.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal