Maison > développement back-end > Golang > Pourquoi la récupération de panique avec des variables locales ne modifie-t-elle pas les valeurs renvoyées dans Go ?

Pourquoi la récupération de panique avec des variables locales ne modifie-t-elle pas les valeurs renvoyées dans Go ?

Patricia Arquette
Libérer: 2024-10-29 23:31:29
original
474 Les gens l'ont consulté

Why Does Panic Recovery with Local Variables Not Change the Returned Values in Go?

Pourquoi la récupération de panique avec des variables locales ne fonctionne-t-elle pas dans Go ?

Dans Go, il est courant d'utiliser la panique et la récupération pour la gestion des erreurs . Cependant, il existe une subtile différence de comportement lors de l'utilisation de variables locales pour les valeurs de retour dans la récupération de panique.

Considérez le code suivant :

<code class="go">func main() {
    result, err := foo()
    fmt.Println("result:", result)
    if err != nil {
        fmt.Println("err:", err)
    }
}

func foo() (result int, err error) {
    defer func() {
        if e := recover(); e != nil {
            result = -1
            err = errors.New(e.(string))
        }
    }()
    bar()

    result = 100
    err = nil
    return
}

func bar() {
    panic("panic happened")
}</code>
Copier après la connexion

Lorsque la panique se produit dans bar(), le recovery( ) la fonction de clôture différée est exécutée. Il attribue -1 au résultat et crée un objet d'erreur. La sortie de ce code est correcte :

result: -1
err: panic happened
Copier après la connexion

Cependant, si nous utilisons des variables locales pour les valeurs de retour :

<code class="go">func main() {
    result, err := foo()
    fmt.Println("result:", result)
    if err != nil {
        fmt.Println("err:", err)
    }
}

func foo() (int, error) {
    var result int
    var err error
    defer func() {
        if e := recover(); e != nil {
            result = -1
            err = errors.New(e.(string))
        }
    }()
    bar()

    result = 100
    err = nil
    return result, err
}

func bar() {
    panic("panic happened")
}</code>
Copier après la connexion

Dans ce cas, la sortie est différente :

result: 0
Copier après la connexion

Cela est dû au fait que la fonction recovery() attribue -1 à la variable locale 'result'. Cependant, puisque la fonction renvoie le résultat de la valeur de retour nommée (qui a été initialisée à zéro), l'affectation de la variable locale n'a aucun effet.

La raison de ce comportement réside dans les bases de la visite Go :

"Les valeurs de retour nommées... sont traitées comme des variables définies en haut de la fonction."

Lors de l'utilisation de valeurs de retour nommées, leurs modifications à l'intérieur de la fermeture différée sont reflétées dans les valeurs renvoyées. Cependant, lors de l'utilisation de variables locales, les modifications ne sont reflétées que dans la portée locale, pas dans les valeurs renvoyé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!

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