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