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!