Renvoi des valeurs des fonctions différées dans Go
Dans Go, une fonction de report vous permet d'exécuter un bloc de code une fois que la fonction actuelle a été exécutée. retourné ou résilié. Bien qu'il soit possible de modifier les paramètres renvoyés dans une fonction defer, il n'est pas possible de renvoyer un nouvel ensemble de valeurs.
Considérez le code suivant :
func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err // Attempt to return new values } }() panic("Report format not recognized.") // ... }
Dans ce code, le defer la fonction tente de renvoyer zéro et de se tromper lorsqu'une panique se produit. Cependant, cela ne fonctionnera pas car les fonctions de report ne peuvent pas renvoyer de valeurs. Au lieu de cela, les paramètres renvoyés, rep et err, doivent être modifiés dans la fonction defer.
De plus, il y a une incompatibilité de type dans le code. La panique se produit avec une chaîne, alors que l'assertion de type attend une erreur. Cela provoquera à nouveau la panique du programme lors de la tentative de conversion de la valeur récupérée en erreur.
Pour corriger le code, nous devons :
Le corrigé code :
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) // Find out the exact error type and set err switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } // Invalidate rep rep = nil } }()
Avec ces modifications, la fonction defer définit désormais correctement err et rep lorsqu'une panique se produit, permettant à la fonction appelante de gérer l'erreur de manière appropriée.
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!