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
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:
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:
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:
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:
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
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.
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
Utilice un interruptor incondicional para imprimir 'neg', 'cero' o 'pos' dependiendo de x.
Mostrar pista
No hay expresión después de `switch`, solo `{`.
Solución disponible después de 3 intentos
¿Qué imprime este programa?
switch 1 {
case 1:
fmt.Print("a")
case 2:
fmt.Print("b")
}Resumen
caseacepta múltiples valores separados por coma.- Sin fallo implícito: cada caso tiene su propio
breakimplícito. switch { ... }sin expresión = cadenaif/else ifmás legible.- Declaración de inicio:
switch x := f(); { ... }, alcance limitado por bloques. fallthroughexiste 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).