En Go, il est possible de déclarer explicitement des noms pour les valeurs de retour dans la signature de la fonction. Ces valeurs sont automatiquement initialisées avec la valeur nulle pour leur type. Cela est pratique lors de la gestion d'un grand nombre de variables de retour, car cela permet de "retourner" implicitement les valeurs via l'instruction return (sans arguments).
Exemple :
func foo() (x int, err error) { if someCheck() { x = 1 return // renverra (1, nil) } return // renverra (0, nil), si x et err n'ont pas été explicitement assignés }
Nuances :
nil pour error) sera retournée. Cela peut masquer des erreurs logiques.Que sera retourné par une fonction avec des résultats nommés, si aucune assignation n'est faite aux variables retournées et si l'on appelle simplement return ?
Réponse : Ce seront leurs valeurs nulles qui seront retournées. Par exemple, pour int — 0, pour un pointeur — nil.
Exemple :
func test() (res *MyType, code int) { return // c'est la même chose que "return nil, 0" }
Histoire
Dans un service financier, ils ont oublié d'assigner une valeur à la variable err (error) à l'intérieur d'une fonction avec des retours nommés. En raison de cela, en cas d'échec, la fonction renvoyait nil, et l'erreur était perdue. En conséquence, le traitement des transactions a échoué, et certaines opérations sont passées inaperçues.
Histoire
Lors du refactoring d'une fonction, un nouveau résultat de retour nommé a été ajouté, mais l'incompatibilité avec le type de retour précédent n'a pas été remarquée — les tests ont manqué le problème en raison du retour de la valeur nulle, ce qui a conduit à un bug silencieux dans le stockage.
Histoire
Dans l'une des fonctions auxiliaires, les erreurs étaient enregistrées via le résultat nommé, mais parfois ils oubliaient de les traiter non seulement au retour, mais également lors de l'enregistrement, ce qui entraînait des bugs difficiles à reproduire ("error lost").