Exploiter la puissance du report dans Go
Dans Go, l'instruction « defer » offre une approche unique de la planification des appels de fonction. Il permet aux développeurs de spécifier le code à exécuter juste avant le retour de la fonction englobante. Cependant, vous vous demandez peut-être pourquoi cette fonctionnalité est bénéfique alors que vous pouvez simplement placer le code à la fin de la fonction.
Contrairement au code positionné à la fin de la fonction, les appels de fonction différés sont garantis d'être exécutés même dans en cas de panique. Les appels de fonction ordinaires seraient ignorés dans de telles situations.
De plus, defer permet aux appels de fonction différés de gérer les paniques en utilisant la fonctionnalité de « récupération » intégrée. Cette fonctionnalité n'est pas disponible pour les appels de fonction réguliers.
Les appels de fonction différés sont empilés et exécutés dans l'ordre inverse une fois la fonction environnante terminée. Cet ordre garantit une désallocation appropriée des ressources. Cependant, il est crucial de noter que les appels de fonction différés dépendent de l'atteinte de l'instruction 'defer' à exécuter.
Conceptualiser 'defer' comme une implémentation alternative des blocs try-catch-finally peut être utile. Il fournit une manière élégante de gérer les tâches de nettoyage et la gestion de la panique.
Par exemple, l'exemple suivant montre la fermeture gracieuse d'un fichier à l'aide de « defer » :
func main() { f, err := os.Create("file") if err != nil { panic("cannot create file") } defer f.Close() // no matter what happens here file will be closed // for sake of simplicity I skip checking close result fmt.Fprintf(f,"hello") }
Extension de l'exemple à inclure la gestion de la panique et la récupération :
func main() { defer func() { msg := recover() fmt.Println(msg) }() f, err := os.Create(".") // . is a current directory if err != nil { panic("cannot create file") } defer f.Close() // no matter what happens here file will be closed // for sake of simplicity I skip checking close result fmt.Fprintf(f,"hello") }
Contrairement aux blocs try-catch-finally, 'defer' simplifie la structure de la fonction environnante en éliminant imbrication et simplification des portées de variables. De plus, les appels de fonction différés peuvent influencer la valeur de retour s'ils peuvent accéder aux données renvoyées, offrant ainsi une flexibilité accrue.
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!