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

Quand le mot-clé defer prend-il effet dans Golang ?

王林
Libérer: 2019-12-09 14:55:39
original
2759 Les gens l'ont consulté

Quand le mot-clé defer prend-il effet dans Golang ?

En golang, nous utilisons l'instruction defer pour effectuer certains travaux de gestion des erreurs et de finition. Sa fonction est similaire au mot-clé enfin en Java. Cependant, qu'il s'agisse du mot-clé enfin de Java ou de la classe Raii de C++, nous pouvons clairement connaître leur portée et leur timing d'exécution. Alors, quand le contenu traité par le mot-clé defer dans Golang est-il exécuté ?

Tout d'abord, la documentation officielle dit : Defer sera exécuté lorsque la fonction revient, que la fonction se termine ou que la goroutine correspondante panique.

Ce qu'il faut noter, c'est que, comme Golang prend en charge les retours à valeurs multiples, la valeur de retour est poussée sur la pile avant d'être renvoyée, tandis que le langage C stocke la valeur de retour dans un registre et la renvoie.

Lorsque Golang revient, il pousse d'abord la valeur de retour sur la pile ; puis exécute la fonction defer si la valeur de retour dans la pile est modifiée dans la fonction defer (mais cela ne doit pas être fait). , alors la valeur de retour sera modifiée ; puis revenez en arrière.

De cette façon, nous connaîtrons le moment de l'exécution defer Même si vous écrivez defer bien avant le retour, il sera toujours exécuté avant le retour de la fonction.

S'il y a plusieurs defers dans une portée, l'ordre d'exécution avant le retour consiste à exécuter d'abord le defer appelé plus tard, puis à exécuter le defer appelé plus tôt.

Il existe plusieurs exemples dans les documents officiels qui peuvent bien illustrer le timing du report, comme suit :

lock(l)
defer unlock(l)  // unlocking happens before surrounding function returns

// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
    defer fmt.Print(i)
}

// f returns 1
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}
Copier après la connexion

Articles et tutoriels connexes recommandés : tutoriel golang

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!

Étiquettes associées:
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