Introdução: operador ternário — amigo ou inimigo?
\n\nSe você veio para Go vindo do mundo C, C++, Java ou JavaScript, certamente está acostumado com a construção concisa:
\n\nint max = (a > b) ? a : b;\n\nEste é o operador ternário. Ele é compacto, elegante e permite escrever uma ramificação simples em uma única linha. Mas quando você começa a programar em Go, uma surpresa o aguarda: Go não tem operador ternário. De forma alguma. Nada de ? :.
Por que os criadores da linguagem tomaram essa decisão? Como escrever atribuições condicionais curtas agora? E o principal — como fazer isso de forma idiomática, ou seja, no estilo aceito pela comunidade Go?
\n\nNeste artigo, abordaremos:
\n- \n
- Por que Go não tem operador ternário (spoiler: é uma decisão consciente). \n
- Como substituir o ternário com
if-else. \n - Técnicas avançadas: funções, map, inlining. \n
- Quando você pode (e deve) quebrar a regra. \n
Vamos lá!
\n\nPor que Go abandonou o operador ternário?
\n\nA resposta é simples e está na filosofia da linguagem: legibilidade é mais importante que concisão.
\n\nRobert Griesemer (um dos criadores do Go) disse uma vez: "O operador ternário é uma fonte de bugs. É muito fácil de ser lido incorretamente, especialmente quando aninhado". E isso é verdade. Lembre-se pelo menos do famoso exemplo em C:
\n\nint x = (a ? b : c) ? d : e;\n\nTente entender rapidamente o que ele faz? Pois é, os criadores do Go decidiram que é melhor sacrificar uma linha, mas tornar o código óbvio.
\n\nEm Go, a prioridade é a clareza das intenções. Se você escreve uma condição, que ela seja explícita. O operador ternário frequentemente se transforma em um "número mágico": você olha para a linha e não entende a lógica imediatamente. Em Go, isso não deve acontecer.
\n\nSubstituição básica: if-else como idioma
\n\nA maneira mais simples e correta de substituir o ternário é usar o if-else comum. Sim, isso ocupa 3 linhas em vez de 1, mas é lido sem esforço.
Exemplo: encontrar o máximo de dois números.
\n\nEm C:
\nint max = (a > b) ? a : b;\n\nEm Go (idiomático):
\nvar max int\nif a > b {\n max = a\n} else {\n max = b\n}\n\n"Mas isso é mais longo!" — você dirá. Sim. Mas veja por outro lado: daqui a um mês você abrirá o código e verá a lógica imediatamente. Sem parênteses, sem ambiguidades. Apenas "se a for maior que b, então max = a, senão max = b".
\n\nAlém disso, a comunidade Go considera esse estilo como o único correto para condições simples. Não tente "dar um jeitinho" e colocar tudo em uma linha — isso será considerado de mau gosto.
\n\nTécnicas avançadas: quando se deseja concisão
\n\nÀs vezes você escreve código onde o if-else ocupa 10 linhas, embora na prática seja uma atribuição simples. Nesses casos, você pode aplicar alguns padrões que mantêm a idiomática, mas tornam o código mais compacto.
1. Função auxiliar
\n\nSe você precisa frequentemente escolher entre dois valores, extraia a lógica para uma função. Isso é especialmente útil para operações de uma linha.
\n\nfunc ternary(cond bool, a, b string) string {\n if cond {\n return a\n }\n return b\n}\n\n// Uso:\ngreeting := ternary(isMorning, "Bom dia", "Boa noite")\n\nImportante: não nomeie a função como ternary — isso é considerado de mau gosto, pois você está tentando "introduzir" o ternário pelos fundos. É melhor dar um nome significativo, como ifElse ou choose. Mas se você está escrevendo para si mesmo — por que não?
2. Uso de map para seleção
\n\nSe a condição se resume a escolher entre duas opções, você pode usar um map com chaves booleanas. Isso parece incomum, mas às vezes é ainda mais legível.
\n\nvar result = map[bo