Maison > développement back-end > Golang > Comment les fermetures Go gèrent-elles les variables de boucle For et évitent les comportements inattendus ?

Comment les fermetures Go gèrent-elles les variables de boucle For et évitent les comportements inattendus ?

Barbara Streisand
Libérer: 2024-12-29 08:41:14
original
765 Les gens l'ont consulté

How Do Go Closures Handle For Loop Variables and Prevent Unexpected Behavior?

Capture de la fermeture (pour la variable de boucle) dans Go

Dans Go, les boucles for ne sont pas comme les boucles foreach en C#, où les variables de boucle ne peuvent pas changer dans le corps de la boucle. Dans Go, les variables de boucle peuvent être modifiées, ce qui nécessite de gérer différemment le comportement de fermeture capturé.

Différences dans la capture

Pour illustrer, examinons trois codes extraits :

Lab1 :

l := [](func() (int32, int32)){}
for k, v := range m {
    // Closure captures the last values assigned to k and v from the range
    l = append(l, func() (int32, int32) { return k, v })
}
Copier après la connexion

Lab2 :

l := [](func() (int32, int32)){}
for k, v := range m {
    // Closure captures the outer variables k and v (which are modified in the loop)
    l = append(l, func() (int32, int32) { return k, v })
}
Copier après la connexion

Lab3 :

l := [](func() (int32, int32)){}
for k, v := range m {
    kLocal, vLocal := k, v // Captures just the values assigned to k and v at the iteration
    l = append(l, func() (int32, int32) { return kLocal, vLocal })
}
Copier après la connexion

Capture d'une variable ou Value

Dans Lab1 et Lab2, les fermetures capturent les dernières valeurs attribuées aux variables de boucle dans le corps de la boucle. Cela peut conduire à des résultats incorrects si les variables de la boucle sont modifiées dans la boucle.

Lab3 démontre l'approche correcte. Il capture les valeurs attribuées aux variables de boucle spécifiquement au sein de chaque itération à l'aide de variables locales. Ce comportement est cohérent avec les fermetures dans Go, où les variables capturées sont par défaut référentiellement transparentes.

Conclusion

Dans Go, les fermetures sur les variables de boucle capturent des valeurs plutôt que des références. Pour capturer les valeurs qui peuvent changer au cours de la boucle, il est nécessaire de créer des variables locales au sein de chaque itération qui attribuent les valeurs souhaitées à la fermeture. Cette approche garantit que le comportement de fermeture répond aux attentes.

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