Maison > développement back-end > Golang > Quelle est l'utilité du report dans le langage go ?

Quelle est l'utilité du report dans le langage go ?

王林
Libérer: 2023-01-11 09:23:20
original
4836 Les gens l'ont consulté

Utilisation de defer dans le langage go : 1. L'instruction defer est exécutée avant le retour de la fonction ou après l'instruction return dans la fonction ; 2. L'ordre d'exécution de plusieurs instructions defer est dans l'ordre inverse ; defer après l'instruction de panique L'instruction n'est pas exécutée.

Quelle est l'utilité du report dans le langage go ?

L'environnement d'exploitation de cet article : système Windows10, GO 1.11.2, ordinateur Thinkpad T480.

(Partage de vidéos d'apprentissage : Vidéo de programmation )

Introduction à l'utilisation :

defer est une instruction d'exécution retardée dans le langage Go, utilisée pour ajouter le fin d'une fonction Code exécuté lors de l'exécution, souvent utilisé pour libérer certaines ressources allouées, fermer les connexions à la base de données, déconnecter les connexions socket et déverrouiller une ressource verrouillée. Le mécanisme du langage Go garantit que le code de l'instruction defer sera exécuté.

Il existe des mécanismes similaires dans d'autres langages, tels que l'instructionfinal en Java et C#, et le destructeur en C++ qui peuvent jouer un rôle similaire. Le mécanisme du langage C++ garantit que l'objet doit être détruit avant de l'être. détruit. Le code dans le destructeur sera exécuté. Le destructeur en C++ détruit l'objet et le defer en Go détruit la fonction.

1. Calendrier d'exécution de l'instruction defer

L'instruction defer est exécutée avant le retour de la fonction ou après l'instruction return dans la fonction (l'instruction return peut appeler une autre fonction). Exemple de code :

package main
 
import (
    "fmt"
)
 
func main() {
    fmt.Println(deferReturn())
}
 
func deferReturn() (ret int) {
    defer func() {
        ret++
    }()
    return 10
}
Copier après la connexion

La valeur imprimée par le code ci-dessus est : 11. L'instruction defer "ret++" dans la fonction anonyme ajoute 1 à la valeur de retour 10 pour devenir 11. Regardons le code où une instruction defer apparaît après l'instruction return :

func returnDefer() (ret int) {
    return 0
    defer func() {
        ret++
        ret++
    }()
    return 1
}
Copier après la connexion

La valeur de retour de la fonction returnDefer ci-dessus est : 0. La raison en est que l'instruction defer est renvoyée avant d'ajouter du code et d'exécuter la fonction "return 0", donc l'instruction defer n'est pas exécutée.

2. L'ordre d'exécution de plusieurs instructions defer est l'ordre inverse

Lorsque plusieurs instructions defer apparaissent, elles sont exécutées dans l'ordre inverse (semblable à une pile, c'est-à-dire dernier entré, premier sorti ). Exemple de code :

func deferSample() {
    for i := 0; i < 5; i++ {
        defer fmt.Printf("%d ", i)
    }
}
Copier après la connexion

Le code ci-dessus affichera : 4 3 2 1 0

3. Différer et panique

1. exécuté

Exemple de code :

func panicDefer() {
    panic("panic")
    defer fmt.Println("defer after panic")
}
Copier après la connexion

La sortie du code ci-dessus est la suivante :

panic: panic
goroutine 1 [running]:
main.panicDefer()
    E:/godemo/testdefer.go:17 +0x39
main.main()
    E:/godemo/testdefer.go:13 +0x20
Process finished with exit code 2
Copier après la connexion

Vous pouvez voir que l'instruction defer n'est pas exécutée.

2. L'instruction defer avant l'instruction de panique sera exécutée

Exemple de code :

func deferPanic() {
    defer fmt.Println("defer before panic")
    panic("panic")
}
Copier après la connexion

La sortie du code ci-dessus est la suivante :

defer before panic
panic: panic
goroutine 1 [running]:
main.deferPanic()
    E:/godemo/testdefer.go:19 +0x95
main.main()
    E:/godemo/testdefer.go:14 +0x20
Process finished with exit code 2
Copier après la connexion

différer le contenu de la sortie de l'instruction.

Panic in Go est similaire au lancement d'exceptions dans d'autres langages. Le code après la panique ne sera plus exécuté (l'instruction defer avant l'instruction de panique sera exécutée).

4. La logique d'implémentation du retour

1. La première étape consiste à attribuer la valeur de retour (si la valeur de retour nommée est affectée directement, la valeur de retour anonyme est d'abord déclarée puis attribuée );
2. Dans la deuxième étape, appelez l'instruction de retour RET et transmettez la valeur de retour. RET vérifiera s'il existe une instruction defer si elle existe, elle insérera l'instruction defer dans l'ordre inverse ; > 3. Enfin, RET quittera la fonction avec la valeur de retour.

On peut voir que le retour n'est pas une opération atomique et que la valeur de retour de la fonction n'est pas nécessairement cohérente avec la valeur de retour RET.

5. L'ordre de report, de retour et de valeur de retour

L'ordre d'exécution de report, de retour et de valeur de retour est le suivant : return attribue d'abord la valeur de retour, puis defer commence à en exécuter ; touches finales Travail ; enfin l'instruction RET quitte la fonction avec la valeur de retour.

Recommandations associées :

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