La sentencia Switch en Go
Cuando utilizamos switch en Go estamos evaluando una condición y distintos resultados para cada caso, es como hacer múltiples if – else con una misma variable como condición.
hagamos un ejemplo simple:
day := "monday" switch day { case "monday": fmt.Println("es lunes") case "tuesday": fmt.Println("es martes") case "wednesday": fmt.Println("es miercoles") case "thursday": fmt.Println("es jueves") case "friday": fmt.Println("es viernes") case "saturday": fmt.Println("es sabado") case "sunday": fmt.Println("es sunday") default: fmt.Println("es sunday") }
es lunes
Vea que este switch no es igual a otros switch de otros lenguajes de programación, en este caso por ejemplo en PHP el switch seguiría imprimiendo es lunes, es martes y así sucesivamente. En este switch no tuvimos que utilizar break
En caso de que tengas que utilizar el switch de que vaya ejecutando las órdenes que siguen dentro de él puedes utilizar:
fallthrough
Utilizando el ejemplo anterior pondremos fallthrough dentro de case «monday»
day := "monday" switch day { case "monday": fmt.Println("es lunes") fallthrough case "tuesday": fmt.Println("es martes") case "wednesday": fmt.Println("es miercoles") case "thursday": fmt.Println("es jueves") case "friday": fmt.Println("es viernes") case "saturday": fmt.Println("es sabado") case "sunday": fmt.Println("es sunday") default: fmt.Println("es sunday") }
es lunes es martes
Un ejemplo que nos da el tour de go es el siguiente:
switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux": fmt.Println("Linux.") default: // freebsd, openbsd, // plan9, windows... fmt.Printf("%s.\n", os) }
Con este pequeño fragmento de código vemos sobre que OS estamos, y es un código bastante útil.
Puedes probar el código en https://play.golang.org/p/IHx1N8Vj7j3
Utilizar Switch de forma comparativa en Go
Otra cosa mas que podemos hacer con switch en Go es usarlo de forma comparativa ya que en algunos casos nos convendra untilizar mas switch que if else-if else.
switch { case edad < 13: fmt.Printf("Edad %d: Niño\n", edad) case edad >= 13 && edad < 18: fmt.Printf("Edad %d: Adolescente\n", edad) case edad >= 18 && edad < 60: fmt.Printf("Edad %d: Adulto\n", edad) default: fmt.Printf("Edad %d: Adulto mayor\n", edad) }
Esta forma de comparar no es posible con switch en algunos otros lenguajes.
Type Switch
type switch no es una forma de utilizar switch muy a menudo, pero existe así que ni modo hay que tocar este tema. Supongamos que necesitas saber el tipo de variable que estás obteniendo. En este caso utilizarías type switch para realizar una acción dependiendo del tipo de esta:
Go nos da un ejemplo sencillo de esta forma de utilizar switch en su tour
package main import "fmt" func do(i interface{}) { switch v := i.(type) { case int: fmt.Printf("Twice %v is %v\n", v, v*2) case string: fmt.Printf("%q is %v bytes long\n", v, len(v)) default: fmt.Printf("I don't know about type %T!\n", v) } } func main() { do(21) do("hello") do(true) }
En tanto a los valores que puede haber en case son los type habituales (int, string, bool, etc) también sus punteros o types creados por nosotros y sus punteros.
Ten en cuenta que necesitaras de interface{} ya que estos valores son chequeados con el tipo de valor que posee la interfaz.
Igualmente la explicación de type switch no me gusta demasiado como quedo redactada, si tienes alguna manera mejor de explicarla puedes hacérmelo saber por twitter