Maison > développement back-end > Golang > Pourquoi utiliser l'instruction « defer » de Go pour un nettoyage garanti et une récupération après panique ?

Pourquoi utiliser l'instruction « defer » de Go pour un nettoyage garanti et une récupération après panique ?

Barbara Streisand
Libérer: 2024-12-27 08:28:10
original
506 Les gens l'ont consulté

Why Use Go's `defer` Statement for Guaranteed Cleanup and Panic Recovery?

Exploiter la puissance du report dans Go

Dans Go, l'instruction « defer » offre une approche unique de la planification des appels de fonction. Il permet aux développeurs de spécifier le code à exécuter juste avant le retour de la fonction englobante. Cependant, vous vous demandez peut-être pourquoi cette fonctionnalité est bénéfique alors que vous pouvez simplement placer le code à la fin de la fonction.

Contrairement au code positionné à la fin de la fonction, les appels de fonction différés sont garantis d'être exécutés même dans en cas de panique. Les appels de fonction ordinaires seraient ignorés dans de telles situations.

De plus, defer permet aux appels de fonction différés de gérer les paniques en utilisant la fonctionnalité de « récupération » intégrée. Cette fonctionnalité n'est pas disponible pour les appels de fonction réguliers.

Les appels de fonction différés sont empilés et exécutés dans l'ordre inverse une fois la fonction environnante terminée. Cet ordre garantit une désallocation appropriée des ressources. Cependant, il est crucial de noter que les appels de fonction différés dépendent de l'atteinte de l'instruction 'defer' à exécuter.

Conceptualiser 'defer' comme une implémentation alternative des blocs try-catch-finally peut être utile. Il fournit une manière élégante de gérer les tâches de nettoyage et la gestion de la panique.

Par exemple, l'exemple suivant montre la fermeture gracieuse d'un fichier à l'aide de « defer » :

func main() {
    f, err := os.Create("file")
    if err != nil {
        panic("cannot create file")
    }
    defer f.Close()
    // no matter what happens here file will be closed
    // for sake of simplicity I skip checking close result
    fmt.Fprintf(f,"hello")
}
Copier après la connexion

Extension de l'exemple à inclure la gestion de la panique et la récupération :

func main() {
    defer func() {
        msg := recover()
        fmt.Println(msg)
    }()
    f, err := os.Create(".") // . is a current directory
    if err != nil {
        panic("cannot create file")
    }
    defer f.Close()
    // no matter what happens here file will be closed
    // for sake of simplicity I skip checking close result
    fmt.Fprintf(f,"hello")
}
Copier après la connexion

Contrairement aux blocs try-catch-finally, 'defer' simplifie la structure de la fonction environnante en éliminant imbrication et simplification des portées de variables. De plus, les appels de fonction différés peuvent influencer la valeur de retour s'ils peuvent accéder aux données renvoyées, offrant ainsi une flexibilité accrue.

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