Différer un retour en Go
En Go, l'instruction defer permet de différer l'exécution d'une fonction jusqu'au retour de la fonction environnante. Cela permet d'exécuter des tâches de nettoyage même en cas de panique, ce qui peut se produire lorsque des erreurs irrécupérables se produisent pendant l'exécution.
Considérez l'extrait de code suivant qui tente de renvoyer une erreur d'une fonction en cas de panique :
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 } }() panic("Report format not recognized.") // rest of the getReport function }
Cependant, ce code ne fonctionne pas comme prévu. L'instruction return dans la fonction différée modifie uniquement les variables locales err et rep dans la fonction et ne les renvoie pas réellement en dehors de la fonction.
Pour résoudre ce problème, nous pouvons utiliser la fonction recovery à l'intérieur de la fonction différée pour récupérez la valeur de panique et définissez le paramètre err en conséquence. De plus, nous devons vérifier le type de valeur de panique et la convertir en erreur si nécessaire.
Voici un code mis à jour :
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } rep = nil } }()
Ce code garantit que le paramètre err est défini sur l'erreur appropriée en fonction de la valeur de panique, et cela invalide également le paramètre rep pour éviter de renvoyer un rapport incomplet.
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!