Maison >développement back-end >Golang >Les fonctions de report peuvent-elles modifier les variables locales pendant la récupération après panique dans Go ?

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

DDD
DDDoriginal
2024-10-29 22:45:03801parcourir

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>

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>

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!

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