Maison > développement back-end > Golang > Comment les boucles « for...range » de Go gèrent-elles les variables de fermeture et comment puis-je éviter un comportement inattendu ?

Comment les boucles « for...range » de Go gèrent-elles les variables de fermeture et comment puis-je éviter un comportement inattendu ?

Linda Hamilton
Libérer: 2024-12-30 08:33:02
original
973 Les gens l'ont consulté

How Do Go's `for...range` Loops Handle Closure Variables, and How Can I Avoid Unexpected Behavior?

Fermeture capturée dans Go : comprendre le comportement des variables de boucle de plage

Dans Go, les boucles for...range se comportent différemment par rapport aux autres for- boucles en raison de leur traitement comme une fermeture. Cet article explore les nuances de la capture des variables de boucle de plage dans les variables de fermeture.

Comportement de fermeture capturé dans les boucles de plage

Contrairement aux boucles foreach de C#, Go's for...range les boucles capturent les variables de boucle (par exemple, les clés et les valeurs) en tant que variables de fermeture. Cependant, Go ne capture pas ces variables directement à partir de la portée de la boucle. Au lieu de cela, il les capture comme dernières valeurs attribuées dans la fermeture de la boucle.

Ce comportement devient évident lorsque vous tentez d'utiliser des fermetures pour créer des tuples dans Go, comme démontré dans l'exemple de code. La fermeture capture les dernières valeurs attribuées aux variables k et v pendant la boucle for...range, entraînant un comportement incorrect.

Correction : copie des variables pour la capture

Pour résoudre ce problème, il est nécessaire de copier explicitement les variables de boucle dans des variables locales à l'aide de l'opérateur := avant de les capturer dans la fermeture.

for k, v := range m {
    kLocal, vLocal := k, v // Copy values to local variables
    f[i] = func() {
        return kLocal, vLocal
    }
}
Copier après la connexion

En copiant k et v à kLocal et vLocal, la fermeture peut désormais accéder correctement aux valeurs prévues pour la variable de boucle pendant l'itération for...range.

Fermeture vs fonction littérale

Il est important de noter la distinction entre les fermetures et les littéraux de fonction dans Go. Les littéraux de fonction créent une nouvelle fonction liée à la portée actuelle, tandis que les fermetures conservent l'accès à leur portée englobante et aux variables partagées.

Boucle de valeur vs boucle variable

De plus, Go fait la différence entre les boucles de valeur et les boucles de variables, où la boucle de valeur lie une copie de la variable de boucle à chaque fermeture tandis que la boucle variable lie la variable de boucle elle-même. Cela peut conduire à un comportement différent, comme observé dans l'exemple de code.

En conclusion, capturer des variables de boucle de plage dans des fermetures dans Go nécessite une attention particulière à la portée de la fermeture et à l'utilisation de variables locales pour copier les valeurs souhaitées. Comprendre ces concepts est essentiel pour écrire du code Go efficace et robuste.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal