Maison > développement back-end > Golang > le corps du texte

Les fonctions de report peuvent-elles modifier les variables locales pendant la récupération après panique dans Go ?

DDD
Libérer: 2024-10-29 22:45:03
original
666 Les gens l'ont consulté

Can Defer Functions Modify Local Variables During Panic Recovery in Go?

Récupération de panique avec des variables locales

Dans Go, la récupération de panique à l'aide de fonctions de report peut modifier les valeurs de retour nommées dans la fonction environnante. Cependant, lorsque des variables locales sont utilisées comme valeurs de retour, ce mécanisme ne fonctionne pas comme prévu.

Considérons l'exemple suivant où les valeurs de retour nommées (result et err) sont modifiées dans la fonction defer :

<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

Ce code récupère d'une panique et modifie correctement les valeurs de retour nommées result et err. Cependant, considérons l'exemple suivant où des variables locales sont utilisées comme 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 fonction defer est incapable de modifier les variables de résultat et d'erreur, ce qui entraîne une sortie inattendue où le résultat reste 0.

Ce comportement découle du fait que l'instruction defer s'applique au littéral de la fonction, et non à la fonction environnante elle-même. Par conséquent, les variables locales (result et err) ne sont pas accessibles au sein de la fonction littérale. En revanche, les valeurs de retour nommées sont accessibles dans le littéral de la fonction puisqu'il s'agit essentiellement de variables initialisées au début de la fonction.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!