La récupération de la 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 de différence pour modifier les valeurs avant de les retourner. Cependant, ce comportement n'est pas cohérent lors de l'utilisation de variables locales dans les littéraux de fonction.
Considérez le code suivant:
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")
}
Ce code fonctionne comme prévu, la définition du résultat à -1 et erre sur un message d'erreur personnalisé après avoir récupéré d'une panique. Cependant, si nous utilisons des variables locales dans la fonction littérale, le comportement change:
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")
}
Dans ce cas, le résultat est réinitialisé à 0 au lieu de -1. En effet, l'instruction de déférer dans la fonction littérale ne peut pas accéder ou modifier les valeurs de retour nommées car elles ne sont plus dans la portée.
conformément à la documentation GO, "... Si la fonction différée est une fonction littérale et la fonction environnante a nommé les paramètres de résultat avant qu'ils soient retournés dans le lital, la fonction de différé peut accéder et modifier le résultat est le résultat avant d'être renvoyé." " Crucial pour utiliser les valeurs de retour nommées lorsque vous essayez de les modifier à l'aide d'une instruction de différence dans un littéral de fonction. Les variables locales dans de tels cas ne peuvent pas être consultées ou modifiées.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3