por dos), o el código dentro del bloque else (en caso de que valor no sea divisible por dos); pero nunca se ejecutarán los dos bloques a la vez.
En los ejemplos anteriores, la variable valor existe y es accesible durante toda la vida de la función main, incluso si solo se necesita en el contexto de los bloques if y else. Es una buena práctica restringir el ciclo de vida de una variable lo máximo que se pueda.
Go permite definir una variable dentro de un if, limitando su ciclo de vida a la evaluación de la condición y las instrucciones de los bloques if y else:
Aplicándolo al ejemplo anterior:
La diferencia es que, mientras anteriormente se podía usar la variable valor en cualquier punto de la función main(), con esta nueva forma la variable valor deja de existir después del bloque else (por ejemplo, no podríamos imprimir su valor en el mensaje de despedida).
CONSEJO: Limitar al máximo la vida de una variable nos ahorrará muchos errores en nuestros programas, algunos de ellos difíciles de detectar.
3.1.3 switch - case
Cuando una variable puede tomar múltiples valores de una enumeración concreta, y se debe realizar una acción distinta para cada uno de estos valores, la forma más concisa de expresarlo es mediante un bloque switch/case:
La orden switch también puede incluir una inicialización de variable, similar a la forma if anteriormente vista:
switch <inicialización variable> ; <expresión a evaluar>
El siguiente ejemplo hace uso del paquete runtime y sus variables globales runtime.GOARCH y runtime.GOOS para extraer información de la arquitectura y del sistema operativo en el que el programa se ejecuta. Como en muchos otros ejemplos a partir de ahora, se omite la definición del paquete, los import y la definición de la función main().
El código anterior mostraría algo similar al siguiente texto (dependiendo del ordenador en el que lo ejecutara):
La arquitectura de su procesador es x86 de 64 bits Su sistema operativo es windows
El primer bloque switch del ejemplo anterior evaluará el valor de la variable arch y mostrará un mensaje distinto dependiendo de si esta variable contiene "386" o "amd64" (valores definidos en las cabeceras de sus respectivos bloques case). El bloque default: se ejecutará si el valor de la variable arch no coincide con ninguno de los valores definidos tras cada case (por ejemplo, si su procesador fuera un ARM, comúnmente usado en tablets y teléfonos inteligentes).
La variable arch, definida en la función main, existirá y será visible desde cualquier punto de la función main (a partir de la declaración de la variable). Sin embargo, observe que el segundo bloque switch define la variable os en la misma línea en la que se comprueba (separado por punto y coma, de manera análoga al bloque if de la sección anterior). En este caso, la existencia y visibilidad de la variable os se limitará al bloque switch.
Si el lector está familiarizado con otros lenguajes de programación, como Java o C, habrá notado la ausencia de la palabra break al final de cada bloque case. En aras de la brevedad, Go la omite. Cuando finaliza el código dentro de un bloque case, el flujo del programa continúa fuera del switch.
Si por algún motivo fuera necesario que, tras acabar el código de un case, el flujo continuara por el siguiente bloque case, se debe usar el comando fallthrough. Ejemplo:
En el ejemplo anterior:
• Si letra == 'a' se mostrará Primera del abecedario.
• Si letra == 'A' se mostrará tanto Mayúscula como primera del abecedario.
Se pueden especificar diferentes valores, separados por comas, detrás de un case. Go ejecutará el código para ese caso si la expresión a comprobar coincide con alguno de esos valores:
La orden switch permite un análisis de patrones más complejo (hasta cierto punto, equivalente a varios if-else encadenados). Por ejemplo:
Observe que, en este caso, la orden switch no especifica ninguna variable, ya que la comprobación de esta se hace en el case.
3.2 ÓRDENES ITERATIVAS (BUCLES for)
Un bucle es un conjunto de órdenes que se repite. El bucle más sencillo que Go permite especificar es:
El bucle anterior es un “bucle infinito”. Si un programa llega a ese punto, el programa jamás continuará más allá del bucle for, a no ser que el bucle se rompa con la instrucción break:
El ejemplo anterior repite un bucle en el que el programa pide un carácter al usuario, y se repite hasta que el usuario introduce el carácter 'S' o 's' , momento en el que el bucle se rompe mediante la instrucción break.
La instrucción continue rompe el flujo de cada iteración de un for. En este caso, el flujo del programa salta de nuevo al inicio del bucle, sin ejecutar las instrucciones restantes de la iteración en que se invoca.
El ejemplo anterior se comportaría de la siguiente manera:
Salir? (s/n): a carácter no reconocido Salir? (s/n): n Salir? (s/n): s adiós!
De acuerdo con el código del ejemplo:
• Si el usuario introduce 'N' o 'n', se ejecutará la instrucción continue, por lo que la ejecución volverá al inicio del for.
• Si el usuario introduce 'S' o 's', se ejecutará la instrucción break, por lo que el for finaliza y la ejecución continúa por el mensaje adiós!
• Solo en el caso de que el usuario introdujera cualquier otro carácter, se mostraría el mensaje carácter no reconocido.
A pesar de lo que promulgan algunas escuelas de programación de corte académico, las órdenes break y continue son totalmente válidas y aceptadas en las convenciones sobre estilo de Go. Sin embargo, a menudo resulta más limpia y útil la forma condicional de for:
Por ejemplo: