Mario Macías Lloret

Programación en Go


Скачать книгу

      2.12 SALIDA ESTÁNDAR DE DATOS

      El paquete fmt, del cual pudo ver una pequeña muestra en el capítulo anterior, permite mostrar datos en su terminal de línea de comandos (también llamado salida estándar) mediante las siguientes funciones:

      fmt.Print fmt.Println fmt.Printf

      fmt.Print y fmt.Println enviarán a la salida estándar los datos que sitúe entre paréntesis, y separados por comas, a continuación del nombre de la función. Para los datos que no sean cadenas de texto, Go hará una conversión genérica a texto antes de enviarlos a la salida estándar. Go, además, añadirá un espacio entre los diferentes datos dentro de una misma invocación a fmt.Print o fmt.Println.

      Ejemplo:

      x := 33 fmt.Println("Hola, número", x, "!")

      Salida estándar:

      Hola, número 33 !

      La diferencia entre fmt.Print y fmt.Println es que fmt.Println añade un salto de línea al final. Es decir, sucesivas invocaciones a fmt.Print serían mostradas una detrás de otra, en la misma línea; mientras que sucesivas invocaciones a fmt.Println serían mostradas en diferentes líneas, una debajo de otra.

      Cuando requiera un control más exhaustivo de cómo se deben mostrar los datos, la función fmt.Printf admite una cadena de texto en la que puede colocar unas “marcas de formato”, conocidas como verbos. A continuación, separados por comas, se colocan los datos que Go debe introducir en el lugar de cada uno de los verbos.

      Por ejemplo, el siguiente ejemplo intercala los verbos %v, que muestran el valor de una variable, y que serán substituidos por las variables a continuación del texto de formato, en orden de aparición:

      cosa := "depósito" x := 36 y := 84 fmt.Printf("Coordenadas de %v: (%v, %v)\n", cosa, x, y)

      Salida estándar:

      Coordenadas de depósito: (36, 84)

      Observe que fmt.Printf no añade ninguna nueva línea al final, por lo que si necesita que el siguiente texto aparezca en la línea siguiente, debe finalizar la cadena de formato con el carácter especial de nueva línea: '\n'.

      La tabla de la Figura 2.5 muestra algunos otros verbos útiles aceptados por fmt.Printf. Para más detalles, visite la documentación del paquete fmt a través del comando godoc que se introdujo en el capítulo anterior.

illustration

      2.13 ENTRADA ESTÁNDAR DE DATOS

      La entrada estándar permite a un programa de Go obtener datos desde el exterior, a través del teclado en la línea de comandos.

      Go proporciona dos funciones para obtener datos desde la entrada estándar:

      fmt.Scan fmt.Scanf

      fmt.Scan lee los datos del teclado y los guarda en las variables pasadas en la invocación. Cada variable debe ir precedida por el símbolo ampersand, & (sabrá el por qué cuando llegue al capítulo 4, sobre apuntadores). Por ejemplo:

      var edad int fmt.Print("Edad? ") fmt.Scan(&edad) fmt.Println("Tienes", edad, "años")

      Ejemplo de entrada y salida estándar:

      Edad? 36 Tienes 36 años

      En el ejemplo anterior, si los datos introducidos no fueran un número entero válido, ignoraría la entrada:

      Edad? manuel Tienes 0 años

      fmt.Scanf permite especificar con más detalle el formato de la entrada, tomando como primer parámetro una cadena de texto en la que se pueden introducir los diversos verbos (como los de la tabla de la Figura 2.5), que se colocarían en sus respectivas variables, ya que tanto fmt.Scan como fmt.Scanf aceptan múltiples variables:

      var hora, minuto, segundo int fmt.Print("HH:MM:SS? ") fmt.Scanf("%d:%d:%d", &hora, &minuto, &segundo) fmt.Printf("%d horas, %d minutos, %d segundos", hora, minuto, segundo)

      Ejemplo de entrada y salida estándar:

      HH:MM:SS? 12:34:56 12 horas, 34 minutos, 56 segundos

       Capítulo 3

       CONTROL DE FLUJO

      Los programas de ejemplo mostrados hasta ahora seguían un “flujo secuencial”: las operaciones se ejecutan una a una, según su orden descendiente de escritura.

      Como en los demás lenguajes de programación, Go permite alterar el flujo secuencial mediante los bloques de control de flujo, que se agrupan en dos tipos:

      • Condicionales. Permiten que un bloque de instrucciones se ejecute o no, dependiendo de si se cumple una condición en el programa.

      • Iterativos. Permiten que un bloque de instrucciones se ejecute repetidamente mientras se dé una condición.

      Por “condición” entendemos cualquier expresión booleana que retorne true o false, como las mostradas en el capítulo anterior.

      3.1 BLOQUES CONDICIONALES

      3.1.1 if

      El bloque if permite agrupar un conjunto de instrucciones que se ejecutarán si —y solo si— su condición asociada es true. Su estructura es:

illustration

      Por ejemplo, el siguiente programa genera un número aleatorio, e informa de que el número generado es par. Dicho mensaje de información solo se mostrará si el número es realmente par:

illustration

      Nótese la importación del paquete math/rand y el uso del comando rand. Int() para la generación de números aleatorios.

      En el programa anterior, el mensaje dentro del bloque if se ejecutará solo si el número aleatorio es divisible por dos (el resto de su división entera es 0).

      Si no se quiere considerar el valor 0 como número par, la condición del bloque if podría completarse mediante el uso de los operadores lógicos vistos en el capítulo anterior:

      if valor != 0 && valor%2 == 0

      3.1.2 if ... else

      Un bloque if puede ser inmediatamente continuado por un bloque else, que ejecutaría el bloque de instrucciones asociado si —y solo si— la condición del if es false. Basándonos en el anterior ejemplo:

illustration illustration

      Por brevedad, se ha omitido la definición del paquete y los import.

      En el programa anterior, siempre