Menu

switch case en Golang: fallthrough y varios valores

Cómo funciona switch en Go: los casos no caen al siguiente por defecto, un caso puede enumerar varios valores, un switch sin condición sustituye a las cadenas if/else, el switch con sentencia de inicio, la palabra clave fallthrough y un vistazo a los type switches.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Un switch compara un valor con una lista de casos y ejecuta el primero que coincide. A diferencia de C, Java y JavaScript, un caso de Go no cae al siguiente, así que no hay ningún break que olvidar.

Los casos se comprueban de arriba abajo, y solo se ejecuta el primero que coincide. default se ejecuta cuando nada coincide; es opcional y puede ir en cualquier posición de la lista, aunque por convención va el último.

Varios valores por caso

case "sat", "sun": coincide con cualquiera de los dos valores. Así expresa Go lo que C hace con casos vacíos apilados. Sirve cualquier tipo comparable: strings, números, runes, booleanos, punteros y tipos con nombre como los enums:

Dos casos con el mismo valor constante son un error de compilación:

./main.go:10:7: duplicate case 1 (constant of type int) in expression switch
	./main.go:8:7: previous case

switch sin condición

Si omites la expresión, cada caso se convierte en una comprobación booleana. Es la forma más limpia que tiene Go de escribir una cadena larga de if/else if:

switch { es una abreviatura de switch true {. Como gana el primer caso verdadero, el orden importa: a bmi < 25 solo se llega cuando bmi < 18.5 era falso, así que cada caso puede dar por hecho que fallaron los de arriba.

switch con sentencia de inicio

Igual que if, un switch puede empezar con una sentencia corta. Las variables declaradas en ella quedan limitadas al switch:

La sentencia de inicio también se puede combinar con un switch sin condición: switch n := len(items); { case n == 0: ... }.

fallthrough

Cuando sí quieres continuar en el siguiente caso, escribe fallthrough como última sentencia de un caso. Pasa el control al cuerpo del siguiente caso sin evaluar su condición:

El nivel 2 imprime write y luego read, acumulando permisos hacia abajo. Las condiciones de los casos posteriores no se comprueban: tras el fallthrough desde case 2, case 1 se ejecuta aunque level valga 2.

Reglas de fallthrough:

  • Tiene que ser la última sentencia del caso.
  • No puede aparecer en el último caso: cannot fallthrough final case in switch.
  • No está permitido en un type switch.

En la práctica, fallthrough es raro en el código Go. Los varios valores por caso cubren la necesidad habitual, y las llamadas explícitas a funciones suelen ser más claras que una cadena de fallthroughs.

break en un switch

break dentro de un caso sale del switch. Los casos terminan solos, así que solo lo necesitas para salir antes de un caso. La trampa es un switch dentro de un bucle:

Sin la etiqueta loop, break termina el switch y el bucle sigue hasta "c". continue, en cambio, siempre se refiere al bucle que lo contiene, porque un switch no es un bucle.

switch sobre tipos

Un type switch se ramifica según el tipo dinámico de un valor de interfaz, usando la forma especial v.(type):

En un caso con un solo tipo, x tiene ese tipo (len(x) funciona en el caso string). En un caso que enumera varios tipos, x conserva el tipo de la interfaz. La página de aserciones de tipo trata en detalle los type switches y la aserción v.(T).

Lo que el switch de Go hace distinto

ComportamientoC, Java, JavaScriptGo
Caer en el siguiente casopor defectosolo con fallthrough
break al final de cada casoobligatoriono hace falta
Varios valores por casocasos vacíos apiladoscase a, b, c:
Valores de los casosconstantes (casi siempre)cualquier expresión, evaluada de arriba abajo
Valor del switchtipos enteros (C)cualquier tipo comparable
Sin expresión en el switchno permitidoswitch { case cond: }

Las expresiones de los casos no tienen por qué ser constantes. case limit(), max + 1: es válido; se evalúan en orden hasta que una coincide, así que las expresiones posteriores pueden no ejecutarse nunca.

Exhaustividad

Go no comprueba que un switch sobre un enum cubra todos los valores. Añade un default que registre, devuelva un error o provoque un panic ante valores que no esperabas, o usa el linter exhaustive (parte de golangci-lint) para que los casos que faltan se informen al compilar.

Preguntas frecuentes

¿El switch de Go cae al siguiente caso?

No. En Go un caso termina automáticamente al llegar al siguiente case; nunca escribes break para pararlo. Si quieres que la ejecución continúe en el cuerpo del siguiente caso, escribe fallthrough como última sentencia del caso. Salta de forma incondicional, sin comprobar la condición del siguiente caso.

¿Cómo compruebo varios valores en un mismo caso en Go?

Enuméralos separados por comas: case "sat", "sun":. El caso se ejecuta si el valor del switch es igual a cualquiera de ellos. Sustituye a los casos vacíos apilados que usarías en C o Java.

¿Qué es un switch sin condición en Go?

switch { case x < 0: ...; case x == 0: ...; default: ... }. Sin expresión detrás de switch, cada caso es una condición booleana y se ejecuta la primera que sea verdadera. Es el sustituto idiomático de una cadena larga de if/else if.

¿Qué hace break dentro de un switch en Go?

Termina el switch, no un bucle for que lo contenga. Rara vez hace falta, porque los casos terminan solos, pero sorprende a quien escribe break dentro de un switch dentro de un bucle esperando salir del bucle. Para eso usa un break con etiqueta o return.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR