Maison > développement back-end > Golang > le corps du texte

Comment l'instruction Defer de Golang capture-t-elle les variables dans une boucle ?

DDD
Libérer: 2024-11-11 22:13:02
original
359 Les gens l'ont consulté

How Does Golang's Defer Statement Capture Variables in a Loop?

Capture de fermeture dans l'instruction Defer de Golang

L'instruction defer de Golang permet d'exécuter des actions de nettoyage après le retour d'une fonction. Cependant, contrairement à la plupart des langages, la fermeture créée par defer ne capture pas l'état actuel des variables dans la fonction environnante, mais les évalue à la place lors de l'exécution de l'instruction defer.

Comprendre la partie 2 par rapport à la partie 3

Dans le code donné, la différence entre la partie 2 et la partie 3 réside dans la façon dont la fermeture capture la variable i.

Partie 2 :

for i := range whatever {
    defer func() { fmt.Println(i) }()
}
Copier après la connexion

Dans la partie 2, la fermeture capture directement la variable i. Lorsque le code de la fermeture s'exécute (une fois la boucle terminée), la valeur de i est déterminée par l'itération finale de la boucle, qui est 4. C'est pourquoi la partie 2 génère "44444".

Partie 3 :

for i := range whatever {
    defer func(n int) { fmt.Println(n) }(i)
}
Copier après la connexion

Dans la partie 3, la fermeture ne capture pas i directement, mais crée à la place une nouvelle variable n et lui attribue la valeur de i au moment de l'exécution de l'instruction defer. Puisque l'instruction defer s'exécute à chaque itération de la boucle, chaque fermeture a une valeur différente pour n. Cela donne la sortie "43210".

Point clé :

Le concept clé à retenir est que le code dans la fermeture en différé n'est pas exécuté lorsque le différé l'instruction est exécutée. Au lieu de cela, les expressions utilisées pour déterminer les arguments de la fermeture (par exemple, i dans ce cas) sont évaluées lors de l'exécution de l'instruction defer.

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