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!