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 } }
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!