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

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

Patricia Arquette
Libérer: 2024-11-11 22:08:02
original
655 Les gens l'ont consulté

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
Copier après la connexion

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!

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