If, switch y type switch en golang
En esta sección del blog veremos como utilizar if switch y type switch, es probable que le sorprenda un poco él no uso de ( ) encerrando la condición, go no necesita estos paréntesis aunque tampoco es excluyente.
If
https://blastcoding.com/if-switch-y-type-switch-en-golang/#ifSi lo viéramos como pseudocódigo seria si se cumple esta condición, hago lo que esta aquí. Veamos un ejemplo ya con el código escrito en go:
elementos:=0 //hago que a cero pero suponga que es una consulta a una base datos y q devuelve 0 if elementos == 0{ printLn("no hay elementos a mostrar") }
Siguiendo con esto y suponiendo que elementos es el número devuelto por una consulta a una base de datos si, elementos = 0, imprimo en pantalla "no hay elementos a mostrar"
En la misma página de golang da un ejemplo de que podemos declarar una variable dentro del if a continuación veremos ese ejemplo:
if err := file.Chmod(0664); err != nil { log.Print(err) return err }
Esto es equivalente a hacer lo siguiente:
err := file.Chmod(0664) if err != nil { log.Print(err) return err }
Vea como ; separa ambas declaraciones. El siguiente fragmento de código en go lo verá a menudo:
if err != nil { //code }
Cuando el error es distinto de nil(nulo), cuando el error es nil se considera que no hay error.
Switch
https://blastcoding.com/if-switch-y-type-switch-en-golang/#switchCuando utilizamos switch 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
Type Switch
https://blastcoding.com/if-switch-y-type-switch-en-golang/#Type_Switchtype 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