DMarlon Studio

Lección 5 · 5 de 20

Leer del teclado · Go

Lea líneas del teclado en Go con bufio.Scanner y conviértalas en números con strconv.Atoi y strconv.ParseFloat para hacer cuentas.

Go · Leer del teclado en DMarlon Studio: el código del ejemplo y su salida en la terminal

bufio.NewScanner(os.Stdin) crea un Scanner que lee la entrada estándar, es decir, lo que se teclea. Cada scanner.Scan() espera una línea y scanner.Text() la devuelve, ya sin el salto de línea final.

En este ejemplo las respuestas salen del archivo input.txt, como si alguien las tecleara, y por eso no aparecen en la salida: se ve la pregunta, escrita con fmt.Print para que la respuesta quede en la misma línea, y a continuación la contestación del programa. En la consola de DMarlon Studio puede escribirlas usted mismo.

Text() siempre da un texto, aunque se teclee 29. Para hacer cuentas hay que convertirlo: strconv.Atoi lo pasa a int y devuelve dos valores, el número y un error. Si el texto no es un número, err no es nil, y el programa avisa y termina con return. Los errores tienen su propia lección, la 13.

strconv.ParseFloat(texto, 64) convierte a float64. Aquí el error se descarta con _, el identificador vacío, porque el ejemplo da por hecho que el precio es correcto: tres entradas de 8.50 cuestan 25.50 euros.

Código · main.go

package mainimport (	"bufio"	"fmt"	"os"	"strconv")func main() {	// A Scanner reads the keyboard (standard input) line by line.	scanner := bufio.NewScanner(os.Stdin)	fmt.Print("What is your name? ")	scanner.Scan()	name := scanner.Text()	fmt.Printf("Nice to meet you, %s!\n", name)	// Text() is always a string: convert it to do maths.	fmt.Print("How old are you? ")	scanner.Scan()	age, err := strconv.Atoi(scanner.Text())	if err != nil {		fmt.Println("That is not a whole number.")		return	}	fmt.Printf("In 10 years you will be %d.\n", age+10)	fmt.Print("Price of a cinema ticket? ")	scanner.Scan()	price, _ := strconv.ParseFloat(scanner.Text(), 64)	fmt.Printf("Three tickets cost %.2f euros.\n", price*3)}

Entrada (lo que se teclea) · input.txt

Lucia
29
8.50

Salida · go run main.go

What is your name? Nice to meet you, Lucia!
How old are you? In 10 years you will be 39.
Price of a cinema ticket? Three tickets cost 25.50 euros.

Para recordar

  • bufio.NewScanner(os.Stdin) lee el teclado.
  • scanner.Scan() lee una línea y scanner.Text() la da.
  • Lo leído es texto: strconv.Atoi y strconv.ParseFloat lo convierten.
  • Las conversiones devuelven también un error; nil es que todo fue bien.
  • _ descarta un valor que no se va a usar.

Ejercicio

Pida también cuántas entradas se quieren comprar, conviértalo con strconv.Atoi comprobando el error, y escriba el precio total con dos decimales.