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
Barbara Streisandoriginal
2024-12-29 08:41:14782parcourir

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

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

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

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!

Déclaration:
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
Article précédent:Forfait Aller IterArticle suivant:Forfait Aller Iter