Pourquoi la récupération de panique avec des variables locales ne fonctionne-t-elle pas dans Go ?
Dans Go, il est courant d'utiliser la panique et la récupération pour la gestion des erreurs . Cependant, il existe une subtile différence de comportement lors de l'utilisation de variables locales pour les valeurs de retour dans la récupération de panique.
Considérez le code suivant :
<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>
Lorsque la panique se produit dans bar(), le recovery( ) la fonction de clôture différée est exécutée. Il attribue -1 au résultat et crée un objet d'erreur. La sortie de ce code est correcte :
result: -1 err: panic happened
Cependant, si nous utilisons des variables locales pour les 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 sortie est différente :
result: 0
Cela est dû au fait que la fonction recovery() attribue -1 à la variable locale 'result'. Cependant, puisque la fonction renvoie le résultat de la valeur de retour nommée (qui a été initialisée à zéro), l'affectation de la variable locale n'a aucun effet.
La raison de ce comportement réside dans les bases de la visite Go :
"Les valeurs de retour nommées... sont traitées comme des variables définies en haut de la fonction."
Lors de l'utilisation de valeurs de retour nommées, leurs modifications à l'intérieur de la fermeture différée sont reflétées dans les valeurs renvoyées. Cependant, lors de l'utilisation de variables locales, les modifications ne sont reflétées que dans la portée locale, pas dans les valeurs renvoyé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!