C'est une plainte courante, et il existe plusieurs réponses à cela.
Voici quelques-unes des plus courantes :
1 - Ce n'est pas si mal
C'est une réaction très courante à ces plaintes. Le fait d'avoir quelques lignes de code supplémentaires dans votre code n'est en fait pas si mal. C'est juste un peu de frappe bon marché, et très facile à gérer du côté de la lecture.
2 - C'est en fait une bonne chose
Cela repose sur le fait que taper et lire ces lignes supplémentaires est un très bon rappel que en fait votre logique pourrait s'échapper à ce moment-là, et vous devez annuler toute gestion des ressources que vous avez mise en place dans les lignes précédentes. Cela est généralement évoqué en comparaison avec les exceptions, qui peuvent interrompre le flux logique de manière implicite, obligeant le développeur à avoir toujours en tête le chemin d'erreur caché. Il y a quelque temps j'ai écrit une critique plus approfondie à ce sujet ici.
3 - Utiliser panic/recover
Dans certaines circonstances spécifiques, vous pouvez éviter une partie de ce travail en utilisant panic
avec un type connu, puis en utilisant recover
juste avant que votre code de package ne soit diffusé, le transformant en une erreur correcte et la retournant à la place. Cette technique est le plus souvent utilisée pour dérouler la logique récursive telle que les (dé)sérialiseurs.
Personnellement, j'essaie de ne pas abuser de cela, car je suis plus proche des points 1 et 2.
4 - Réorganiser un peu le code
Dans certaines circonstances, vous pouvez réorganiser légèrement la logique pour éviter la répétition.
Comme exemple trivial, ceci :
err := doA()
if err != nil {
return err
}
err := doB()
if err != nil {
return err
}
return nil
peut aussi être organisé comme suit :
err := doA()
if err != nil {
return err
}
return doB()
5 - Utiliser des résultats nommés
Certaines personnes utilisent des résultats nommés pour supprimer la variable err de l'instruction de retour. Je déconseillerais de le faire, cependant, car cela économise très peu, réduit la clarté du code, et rend la logique sujette à des problèmes subtils lorsque un ou plusieurs résultats sont définis avant l'instruction de retour de sortie.
6 - Utiliser la déclaration avant la condition if
Comme Tom Wilde l'a bien rappelé dans le commentaire ci-dessous, les instructions if
en Go acceptent une simple déclaration avant la condition. Vous pouvez donc faire ceci :
if err := doA(); err != nil {
return err
}
C'est un bel idiome Go, et souvent utilisé.
Dans certains cas spécifiques, je préfère éviter d'intégrer la déclaration de cette manière juste pour qu'elle se démarque par sa clarté, mais c'est une chose subtile et personnelle.