HOWTO · Go

El equivalente idiomático en Go del operador ternario de C

Este tutorial explora el equivalente idiomático en Go del operador ternario de C utilizando sentencias if-else. Aprenda a implementar lógica condicional en Go con ejemplos y explicaciones claros. Descubra los beneficios de la filosofía de diseño de Go, que enfatiza la legibilidad y la facilidad de mantenimiento, lo que hace que su código sea más fácil de entender.

En esta página

Go no tiene operador ternario. Para elegir un valor a partir de una condición, use una sentencia if/else y asigne el resultado en cada rama. Esto mantiene la decisión visible como flujo de control y funciona en cualquier lugar donde se permita una sentencia.

Qué hace el operador ternario de C

El operador condicional de C utiliza la forma condition ? true_expression : false_expression. Tiene tres operandos: una condición y dos expresiones que proporcionan el resultado. C evalúa la condición y luego evalúa la expresión después de ? cuando es verdadera o la expresión después de : cuando es falsa. Por ejemplo, int b = (a > 3) ? 10 : 20; asigna 10 a b cuando a es mayor que 3, y 20 en caso contrario.

Esa forma es una expresión, por lo que puede aparecer dentro de una expresión mayor o en el lado derecho de una asignación. Go deliberadamente no tiene una expresión condicional en línea equivalente. Su sentencia if es una sentencia, por lo que una traducción a Go coloca las asignaciones en las ramas en lugar de tratar de poner if donde C espera una expresión.

Usar if-else en Go

El siguiente programa completo traduce la asignación de C y también demuestra cómo asignar 1 o 0 a partir de una condición booleana. La declaración corta a := 5 crea e inicializa a; var b int declara b antes de que cualquiera de las ramas le asigne un valor. La rama else debe ir unida a la llave de cierre de la rama if. Cambie a para ver qué valor asigna cada decisión.

package main

import "fmt"

func main() {
    a := 5

    var b int
    if a > 3 {
        b = 10
    } else {
        b = 20
    }

    var isLarge int
    if a > 3 {
        isLarge = 1
    } else {
        isLarge = 0
    }

    fmt.Println(b)
    fmt.Println(isLarge)
}
10
1

La primera decisión selecciona entre 10 y 20, coincidiendo con la asignación de C. La segunda convierte la condición en un indicador entero. Estas son asignaciones ordinarias en cada rama. La salida anterior muestra los valores impresos por el programa.

Un if también puede incluir una sentencia de inicialización, como if n := len(items); n > 0 { ... }. La variable declarada allí está limitada a la sentencia if y sus ramas else. Use esta forma cuando el valor se necesite solo para esa decisión; en caso contrario, declárelo antes de la sentencia para que el código posterior pueda usarlo.

Manejar múltiples condiciones en Go

Cuando una decisión tiene más de dos resultados, una cadena if/else if hace explícito el orden. Go comprueba las condiciones de arriba a abajo y ejecuta la primera rama coincidente; el else final maneja todos los valores restantes. Coloque las distinciones más útiles en un orden claro, especialmente cuando una condición incluye valores coincidentes con otra.

Para varios valores mutuamente excluyentes de una expresión, un switch puede ser más fácil de examinar que una cadena larga. Un switch convencional compara un valor con sus valores case. Go también permite un switch sin expresión, donde cada case contiene una condición booleana, similar a una cadena if/else if. Por ejemplo, switch { case score >= 90: grade = "A"; case score >= 80: grade = "B"; default: grade = "C" } expresa rangos ordenados. En el código fuente de Go formateado, coloque el cuerpo de cada caso en sus propias líneas para mayor legibilidad.

Ni un switch ni una cadena if son una expresión ternaria: ambos son sentencias que controlan qué sentencias se ejecutan. Elija if/else para una decisión pequeña o condiciones ordenadas, y elija switch cuando agrupar varios casos haga que las opciones sean más fáciles de entender. Un switch es una opción, no un reemplazo universalmente mejor; la forma de la decisión debe guiar la elección.

FAQ

¿Qué es el operador ternario en C?

Es el operador condicional de C, escrito condition ? true_expression : false_expression. La condición selecciona una de las dos expresiones de resultado.

¿Go tiene un operador ternario?

No. Go utiliza sentencias if/else para la lógica condicional. No puede usar una sentencia if como expresión en línea en una asignación o en un argumento de función.

¿Puedo usar sentencias if-else anidadas en Go?

Sí. Para varios resultados, una cadena else if suele ser más fácil de seguir que anidar cada if dentro de otro. Ambas formas son sentencias, y cada rama puede asignar un valor o realizar otro trabajo.

¿Cuándo debería usar switch en su lugar?

Use switch cuando los casos formen un conjunto claro de alternativas o cuando un switch sin expresión haga que varias condiciones relacionadas sean más fáciles de leer. Use una cadena if/else if cuando las comparaciones ordenadas comuniquen la decisión de manera más directa.

La traducción práctica es mantener explícitos la condición y sus alternativas: use el ?: de C al leer código C, y use las sentencias if/else o switch de Go para el flujo de control correspondiente en Go.