ProgrammationDéveloppeur Go Senior

Comment fonctionnent les valeurs de retour nommées en Go ? Quels sont les avantages et les dangers associés à leur utilisation, et quelles sont les spécificités des valeurs nulles dans ce contexte ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Si l'on oublie d'assigner explicitement une erreur à la variable, sa valeur nulle (généralement nil pour error) sera retournée. Cela peut masquer des erreurs logiques.
  • Les valeurs nulles pour les résultats nommés sont utilisées pour l'initialisation et le retour par défaut.
  • Utilisez les résultats nommés avec prudence : ils améliorent la lisibilité uniquement lorsque le retour de la fonction a un sens clair.

Question piège

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" }

Exemples d'erreurs réelles


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").