Maison >développement back-end >Golang >Comment l'instruction « defer » de Go gère-t-elle les paramètres de fermeture ?

Comment l'instruction « defer » de Go gère-t-elle les paramètres de fermeture ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-11 22:08:02725parcourir

How Does Go's `defer` Statement Handle Closure Parameters?

Fermeture "defer" de Go : comprendre la capture du paramètre de fermeture

Dans Go, l'instruction "defer" permet aux fonctions de différer l'exécution d'un appel de fonction jusqu'à ce que la fonction environnante revient. Ce comportement peut conduire à des résultats inattendus lorsque l'instruction defer capture les paramètres de fermeture.

Partie 2 et partie 3 : le paramètre capturé

Considérez le code suivant :

for i := range whatever {
    defer func() { fmt.Println(i) }()
} // part 2

for i := range whatever {
    defer func(n int) { fmt.Println(n) }(i)
} // part 3

Partie 2 :
Dans la « partie 2 », le L'instruction defer crée une fermeture qui capture la variable "i". Lorsque la fermeture est exécutée, la variable "i" a la valeur qu'elle avait lors de la dernière itération de l'instruction range, qui est 4. Par conséquent, le résultat est "44444".

Partie 3 :
Dans la "partie 3", l'instruction defer crée une fermeture qui ne capture aucune variable externe. Le paramètre "n" de la fermeture est évalué lors de l'exécution de l'instruction defer et reçoit la valeur "i" à ce moment-là. Cela aboutit à la sortie souhaitée de "43210" car chaque appel de fonction différé utilise une valeur différente pour "n". retarder l'exécution des appels de fonction jusqu'au retour de la fonction environnante.

Lorsqu'une fermeture capture un paramètre, la valeur du paramètre est gelée au moment où la fermeture est créé.Lorsqu'une fermeture ne capture aucune variable externe, ses paramètres sont évalués lors de l'exécution de l'instruction defer.

    L'ordre d'exécution des instructions defer est Last-In-First-Out (LIFO ).
  • Comprendre le comportement de capture des instructions defer est crucial pour éviter des résultats inattendus dans votre code Go.

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