Saltar al contenido principal
eLearner.app
Módulo 2 · Lección 4 de 59/50 en el curso~10 min
Lecciones del módulo (4/5)

Switch idiomático

El switch de Go es más ergonómico que el de C/Java: cada case tiene la su bloque implícito (no hay break para escribir), se pueden agrupar múltiples valores con la coma, y un switch inexpresivo se comporta como una cadena if/else if más legible.

Cambiar a un valor

Go
giorno := "mar"
switch giorno {
case "lun", "mar", "mer", "gio", "ven":
    fmt.Println("feriale")
case "sab", "dom":
    fmt.Println("weekend")
default:
    fmt.Println("sconosciuto")
}

case acepta múltiples valores separados por comas y no hay ninguna solución alternativa implícito: tan pronto como se ejecuta un caso, el cambio sale.

Cambiar sin condición

Si omite la expresión, el modificador evalúa true y cada case es un condición bool. Es la alternativa idiomática a las cadenas largas if/else if:

Go
switch {
case x < 0:
    fmt.Println("negativo")
case x == 0:
    fmt.Println("zero")
case x < 10:
    fmt.Println("piccolo")
default:
    fmt.Println("grande")
}

Declaración de inicio

Al igual que con if, switch también acepta una declaración de inicio:

Go
switch n := len(s); {
case n == 0:
    fmt.Println("vuoto")
case n > 100:
    fmt.Println("lungo")
default:
    fmt.Println("ok")
}

n existe solo dentro del conmutador.

fallthrough explícito

Si realmente desea que la ejecución caiga en el siguiente caso, debe escribirlo:

Go
switch 1 {
case 1:
    fmt.Println("uno")
    fallthrough
case 2:
    fmt.Println("due")  // anche questo viene stampato
case 3:
    fmt.Println("tre")  // questo no
}

Tipo de cambio (noción)

Le permite discriminar según el tipo dinámico de un valor interfaz. Lo veremos en profundidad en el módulo de Interfaces:

Go
var i interface{} = "ciao"
switch v := i.(type) {
case int:
    fmt.Println("int:", v)
case string:
    fmt.Println("string:", v)
default:
    fmt.Printf("tipo %T\n", v)
}

Pruébalo tú mismo

Ejercicio#go.m2.l4.e1
Intentos: 0Cargando...

Imprima 'día laborable' para lunes/martes/miércoles/jueves/viernes; en caso contrario, 'fin de semana', usando un interruptor en el valor de g.

Cargando editor...
Mostrar pista

Agrupa los 5 días de la semana en un solo caso separados por comas.

Solución disponible después de 3 intentos

Ejercicio#go.m2.l4.e2
Intentos: 0Cargando...

Utilice un interruptor incondicional para imprimir 'neg', 'cero' o 'pos' dependiendo de x.

Cargando editor...
Mostrar pista

No hay expresión después de `switch`, solo `{`.

Solución disponible después de 3 intentos

Cuestionario#go.m2.l4.e3
Listo

¿Qué imprime este programa?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
Opciones de respuesta

Resumen

  • case acepta múltiples valores separados por coma.
  • Sin fallo implícito: cada caso tiene su propio break implícito.
  • switch { ... } sin expresión = cadena if/else if más legible.
  • Declaración de inicio: switch x := f(); { ... }, alcance limitado por bloques.
  • fallthrough existe pero es poco común; entra en el caso posteriormente SIN evaluar su estado.
  • Escriba el interruptor v := i.(type) para discriminar según el tipo dinámico (módulo de Interfaces).