Maison >développement back-end >Golang >Comment le mot-clé « defer » de Go simplifie-t-il la gestion des ressources et la gestion des paniques ?

Comment le mot-clé « defer » de Go simplifie-t-il la gestion des ressources et la gestion des paniques ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-14 14:12:15570parcourir

How Does Go's `defer` Keyword Simplify Resource Management and Panic Handling?

Utilisation de defer dans Go

Le mot-clé defer dans Go vous permet d'exécuter une fonction juste avant le retour de la fonction environnante, garantissant que les actions sont pris même en cas de panique.

Avantages du report par rapport au code placé sur la fonction Fin

  • Dé-/Allocation fiable des ressources :
    le report garantit le nettoyage des ressources, comme la fermeture de fichiers, même lorsque la fonction panique ou revient brusquement.
  • Gestion des paniques :
    Les fonctions différées peuvent gérer les paniques en appelant recovery(). Cela permet une gestion et une récupération personnalisées des erreurs.
  • Ordre d'exécution contrôlé :
    Les appels différés sont empilés dans l'ordre inverse et exécutés au retour de la fonction environnante, offrant un moyen déterministe de désallouer les ressources. .
  • Aucune étendue imbriquée :
    Contrairement à try-catch-finally blocs, defer simplifie la structure de la fonction environnante en évitant les portées imbriquées.

Exemples :

  • Ressource Try-finally Nettoyage :

    func main() {
        f, err := os.Create("file")
        if err != nil {
            panic("cannot create file")
        }
        defer f.Close()
        fmt.Fprintf(f, "hello")
    }
  • Essayez-attrapez-enfin avec la gestion de la panique :

    func main() {
        defer func() {
            msg := recover()
            fmt.Println(msg)
        }()
        f, err := os.Create(".") // . is the current directory
        if err != nil {
            panic("cannot create file")
        }
        defer f.Close()
        fmt.Fprintf(f, "hello")
    }
  • Retour modifié Valeurs :

    func yes() (text string) {
        defer func() {
            text = "no"
        }()
        return "yes"
    }
    
    func main() {
        fmt.Println(yes()) // Prints "no"
    }

En résumé, le report dans Go offre un moyen flexible d'assurer le nettoyage des ressources, de gérer les paniques et de contrôler l'ordre d'exécution sans avoir besoin de structures de blocs imbriquées.

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