Introducción: ¿el operador ternario es amigo o enemigo?
\n\nSi vienes a Go desde el mundo de C, C++, Java o JavaScript, seguramente estás acostumbrado a la construcción concisa:
\n\nint max = (a > b) ? a : b;\n\nEste es el operador ternario. Es compacto, elegante y permite escribir una ramificación simple en una sola línea. Pero cuando empiezas a escribir en Go, te espera una sorpresa: Go no tiene operador ternario. En absoluto. Nada de ? :.
¿Por qué los creadores del lenguaje tomaron esta decisión? ¿Cómo escribir ahora asignaciones condicionales cortas? Y lo más importante: ¿cómo hacerlo de manera idiomática, es decir, en el estilo aceptado por la comunidad Go?
\n\nEn este artículo analizaremos:
\n- \n
- Por qué Go no tiene operador ternario (spoiler: es una decisión consciente). \n
- Cómo reemplazar el ternario con
if-else. \n - Técnicas avanzadas: funciones, map, inlining. \n
- Cuándo se puede (y se debe) romper la regla. \n
¡Allá vamos!
\n\n¿Por qué Go renunció al operador ternario?
\n\nLa respuesta es simple y está en la filosofía del lenguaje: la legibilidad es más importante que la brevedad.
\n\nRobert Griesemer (uno de los creadores de Go) dijo una vez: «El operador ternario es una fuente de errores. Es demasiado fácil de leer incorrectamente, especialmente cuando está anidado». Y es cierto. Recuerda al menos el famoso ejemplo en C:
\n\nint x = (a ? b : c) ? d : e;\n\n¿Puedes entender de inmediato qué hace? Pues los creadores de Go decidieron que es mejor sacrificar una línea, pero hacer que el código sea obvio.
\n\nEn Go, la prioridad es la claridad de las intenciones. Si escribes una condición, que sea explícita. El operador ternario a menudo se convierte en un «número mágico»: miras la línea y no entiendes la lógica de inmediato. En Go, esto no debería ocurrir.
\n\nReemplazo básico: if-else como modismo
\n\nLa forma más simple y correcta de reemplazar el ternario es usar un if-else normal. Sí, ocupa 3 líneas en lugar de 1, pero se lee sin esfuerzo.
Ejemplo: encontrar el máximo de dos números.
\n\nEn C:
\nint max = (a > b) ? a : b;\n\nEn Go (idiomático):
\nvar max int\nif a > b {\n max = a\n} else {\n max = b\n}\n\n«¡Pero es más largo!» — dirás. Sí. Pero míralo desde otro ángulo: dentro de un mes abrirás el código y verás la lógica de inmediato. Sin paréntesis, sin ambigüedades. Simplemente «si a es mayor que b, entonces max = a, si no, max = b».
\n\nMás aún, la comunidad Go considera este estilo como el único correcto para condiciones simples. No intentes «hacer trampa» y meter todo en una sola línea: se considerará de mal gusto.
\n\nTécnicas avanzadas: cuando quieres brevedad
\n\nA veces escribes código donde if-else ocupa 10 líneas, aunque en esencia es una asignación simple. En estos casos, puedes aplicar algunos patrones que mantienen la idiomaticidad, pero hacen el código más compacto.
1. Función auxiliar
\n\nSi a menudo necesitas elegir entre dos valores, extrae la lógica en una función. Esto es especialmente útil para operaciones de una sola línea.
\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, "Buenos días", "Buenas tardes")\n\nImportante: no llames a la función ternary — se considera de mal gusto, ya que intentas «colar» el ternario por la puerta trasera. Es mejor darle un nombre significativo, como ifElse o choose. Pero si escribes para ti mismo, ¿por qué no?
2. Uso de map para selección
\n\nSi la condición se reduce a elegir entre dos opciones, puedes usar un map con claves booleanas. Se ve inusual, pero a veces se lee incluso mejor.
\n\nvar result = map[bo