Maison > développement back-end > Golang > Les fonctions différées peuvent-elles renvoyer des valeurs en Go ?

Les fonctions différées peuvent-elles renvoyer des valeurs en Go ?

Linda Hamilton
Libérer: 2024-11-16 17:46:03
original
864 Les gens l'ont consulté

Can Deferred Functions Return Values in Go?

Renvoi des valeurs des fonctions différées dans Go

Dans Go, une fonction de report vous permet d'exécuter un bloc de code une fois que la fonction actuelle a été exécutée. retourné ou résilié. Bien qu'il soit possible de modifier les paramètres renvoyés dans une fonction defer, il n'est pas possible de renvoyer un nouvel ensemble de valeurs.

Considérez le code suivant :

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err // Attempt to return new values
        }
    }()
    panic("Report format not recognized.")
    // ...
}
Copier après la connexion

Dans ce code, le defer la fonction tente de renvoyer zéro et de se tromper lorsqu'une panique se produit. Cependant, cela ne fonctionnera pas car les fonctions de report ne peuvent pas renvoyer de valeurs. Au lieu de cela, les paramètres renvoyés, rep et err, doivent être modifiés dans la fonction defer.

De plus, il y a une incompatibilité de type dans le code. La panique se produit avec une chaîne, alors que l'assertion de type attend une erreur. Cela provoquera à nouveau la panique du programme lors de la tentative de conversion de la valeur récupérée en erreur.

Pour corriger le code, nous devons :

  1. Supprimer la tentative de retour des valeurs de la fonction de report.
  2. Assurez-vous que la valeur récupérée est correctement affirmée.

Le corrigé code :

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        // Find out the exact error type and set err
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        // Invalidate rep
        rep = nil
    }
}()
Copier après la connexion

Avec ces modifications, la fonction defer définit désormais correctement err et rep lorsqu'une panique se produit, permettant à la fonction appelante de gérer l'erreur de manière appropriée.

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