Introduction : l'opérateur ternaire — ami ou ennemi ?
\n\nSi vous venez en Go du monde de C, C++, Java ou JavaScript, vous êtes probablement habitué à la construction concise :
\n\nint max = (a > b) ? a : b;\n\nC'est l'opérateur ternaire. Il est compact, élégant et permet d'écrire une simple branche conditionnelle en une seule ligne. Mais lorsque vous commencez à coder en Go, une surprise vous attend : Go n'a pas d'opérateur ternaire. Pas du tout. Aucun ? :.
Pourquoi les créateurs du langage ont-ils fait ce choix ? Comment écrire maintenant des affectations conditionnelles courtes ? Et surtout, comment le faire idiomatiquement, c'est-à-dire dans le style adopté par la communauté Go ?
\n\nDans cet article, nous allons voir :
\n- \n
- Pourquoi Go n'a pas d'opérateur ternaire (spoiler : c'est une décision délibérée). \n
- Comment remplacer le ternaire avec
if-else. \n - Les techniques avancées : fonctions, map, inlining. \n
- Quand on peut (et doit) enfreindre la règle. \n
C'est parti !
\n\nPourquoi Go a-t-il renoncé à l'opérateur ternaire ?
\n\nLa réponse est simple et relève de la philosophie du langage : la lisibilité prime sur la concision.
\n\nRobert Griesemer (l'un des créateurs de Go) a dit un jour : « L'opérateur ternaire est une source de bugs. Il est trop facile à lire incorrectement, surtout lorsqu'il est imbriqué ». Et c'est vrai. Souvenez-vous au moins du célèbre exemple en C :
\n\nint x = (a ? b : c) ? d : e;\n\nEssayez de comprendre immédiatement ce qu'il fait ? Les créateurs de Go ont donc décidé qu'il valait mieux sacrifier une ligne, mais rendre le code évident.
\n\nEn Go, la priorité est la clarté des intentions. Si vous écrivez une condition, qu'elle soit explicite. L'opérateur ternaire se transforme souvent en « nombre magique » : vous regardez la ligne et ne comprenez pas immédiatement la logique. En Go, cela ne doit pas arriver.
\n\nRemplacement de base : if-else comme idiome
\n\nLa façon la plus simple et la plus correcte de remplacer le ternaire est d'utiliser un if-else classique. Oui, cela prend 3 lignes au lieu d'une, mais cela se lit sans effort.
Exemple : trouver le maximum de deux nombres.
\n\nEn C :
\nint max = (a > b) ? a : b;\n\nEn Go (idiomatique) :
\nvar max int\nif a > b {\n max = a\n} else {\n max = b\n}\n\n« Mais c'est plus long ! » direz-vous. Oui. Mais regardez cela d'un autre côté : dans un mois, vous ouvrirez le code et verrez immédiatement la logique. Pas de parenthèses, pas d'ambiguïtés. Simplement « si a est plus grand que b, alors max = a, sinon max = b ».
\n\nDe plus, la communauté Go considère ce style comme le seul correct pour les conditions simples. N'essayez pas de « tricher » et de tout mettre sur une seule ligne — cela sera considéré comme de mauvais goût.
\n\nTechniques avancées : quand on souhaite de la concision
\n\nParfois, vous écrivez du code où if-else prend 10 lignes, alors qu'il s'agit en fait d'une simple affectation. Dans ces cas, vous pouvez appliquer quelques motifs qui conservent l'idiomaticité tout en rendant le code plus compact.
1. Fonction auxiliaire
\n\nSi vous devez souvent choisir entre deux valeurs, extrayez la logique dans une fonction. C'est particulièrement pratique pour les opérations sur une seule ligne.
\n\nfunc ternary(cond bool, a, b string) string {\n if cond {\n return a\n }\n return b\n}\n\n// Utilisation :\ngreeting := ternary(isMorning, "Bonjour", "Bonsoir")\n\nImportant : n'appelez pas la fonction ternary — cela est considéré comme de mauvais goût, car vous essayez de « faire passer » le ternaire par une porte dérobée. Il est préférable de donner un nom significatif, comme ifElse ou choose. Mais si vous écrivez pour vous-même — pourquoi pas ?
2. Utilisation d'une map pour la sélection
\n\nSi la condition se résume à un choix entre deux options, vous pouvez utiliser une map avec des clés booléennes. Cela semble inhabituel, mais parfois c'est encore plus lisible.
\n\nvar result = map[bo