Maison  >  Article  >  développement back-end  >  Panic Recovery peut-il modifier les variables locales dans les littéraux de fonction dans Go ?

Panic Recovery peut-il modifier les variables locales dans les littéraux de fonction dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 09:18:02289parcourir

Can Panic Recovery Modify Local Variables in Function Literals in Go?

La récupération de panique peut-elle modifier les variables locales dans les littéraux de fonction ?

Dans Go, lorsque vous travaillez avec des valeurs de retour nommées, vous pouvez utiliser une instruction defer pour modifier les valeurs avant de les renvoyer. Cependant, ce comportement n'est pas cohérent lors de l'utilisation de variables locales dans des littéraux de fonction.

Considérez le code suivant :

<code class="go">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 fonctionne comme prévu, en définissant le résultat sur -1 et l'erreur sur un message d'erreur personnalisé après avoir récupéré d'une panique. Cependant, si nous utilisons des variables locales dans le littéral de la fonction, le comportement change :

<code class="go">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, le résultat est réinitialisé à 0 au lieu de -1. En effet, l'instruction defer dans le littéral de fonction ne peut pas accéder ou modifier les valeurs de retour nommées car elles ne sont plus dans la portée.

Selon la documentation Go, "... si la fonction différée est une fonction littérale et que la fonction environnante a nommé des paramètres de résultat qui sont dans la portée du littéral, la fonction différée peut accéder et modifier les paramètres de résultat avant qu'ils ne soient renvoyés. "

Par conséquent, il est crucial d'utiliser des valeurs de retour nommées lorsque vous essayez pour les modifier à l'aide d'une instruction defer dans un littéral de fonction. Dans de tels cas, les variables locales ne sont ni accessibles ni modifié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