Чтение с консоли

Последнее обновление: 15.01.2018

В Go имеется объект os.Stdin, который реализует интерфейс io.Reader и позволяет считывать данные с консоли. Например, мы можем использовать функцию fmt.Fscan() для считывания с консоли с помощью os.Stdin:

package main
import (
	"fmt"
	"os"
)

func main() {
	var name string
	var age int
	fmt.Print("Введите имя: ")
	fmt.Fscan(os.Stdin, &name) 
	
	fmt.Print("Введите возраст: ")
	fmt.Fscan(os.Stdin, &age)
	
	fmt.Println(name, age)
}

При запуске программы мы сможем вводить данные с консоли, и они перейдут в переменные name и age:

Введите имя: Tom
Введите возраст: 24
Tom 24

Однако также для получения ввода с консоли мы можем использовать встроенные функции fmt.Scan(), fmt.Scanln() и fmt.Scanf(), которые аналогичны соответственно функциям fmt.Fscan(), fmt.Scanln() и fmt.Scanf():

func Scan(a ...interface{}) (n int, err error)
func Scanf(format string, a ...interface{}) (n int, err error)
func Scanln(a ...interface{}) (n int, err error)

Все эти функции уже по умолчанию считывают данные с потока os.Stdin:

package main
import (
	"fmt"
	"os"
)

func main() {
	var name string
	var age int
	fmt.Print("Введите имя: ")
	fmt.Scan(&name) 
	fmt.Print("Введите возраст: ")
	fmt.Scan(&age)
	
	fmt.Println(name, age)
}

или так

package main
import (
	"fmt"
	"os"
)

func main() {
	var name string
	var age int
	fmt.Print("Введите имя и возраст: ")
	fmt.Scan(&name, &age)
	fmt.Println(name, age)
	
	// альтернативный вариант
	//fmt.Println("Введите имя и возраст:")
	//fmt.Scanf("%s %d", &name, &age)
	//fmt.Println(name, age)
}

В случае если вводятся сразу несколько значений, то разделителем между ними является пробел. Хотя теоретически строка может включать внутренние пробелы, тем не менее данные функции считывают значение строки и других типов данных до пробела:

Введите имя и возраст: Tom 34
Tom 34
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850