У каждого процесса есть свой стандартный ввод, вывод и дескриптор файла ошибок. stdin выступает в роли процесса ввода данных. Данная инструкция описывает, как читать данные из stdin.
Как читать ввод с клавиатуры в командной строке в Golang?
1. Создайте файл fmt.go со следующим содержимым:
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" ) func main() { var name string fmt.Println("Как тебя зовут?") fmt.Scanf("%s\n", &name) var age int fmt.Println("Сколько тебе лет?") fmt.Scanf("%d\n", &age) fmt.Printf("Привет, %s, твой возраст - %d\n", name, age) } |
2. Выполните код через go run fmt.go;
3. Введите имя Джон и нажмите Enter;
4. Введите возраст 40 и нажмите Enter;
5. Посмотрите на финальный результат:
|
1 2 3 4 5 |
Как тебя зовут? Джон Сколько тебе лет? 40 Привет, Джон, твой возраст - 40 |
6. Создайте файл scanner.go со следующим содержимым:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package main import ( "bufio" "fmt" "os" ) func main() { // Scanner может просканировать построчный ввод sc := bufio.NewScanner(os.Stdin) for sc.Scan() { txt := sc.Text() fmt.Printf("Эхо: %s\n", txt) } } |
7. Выполните код через go run scanner.go;
8. Введите слово Привет и нажмите Enter;
9. Нажмите CTRL + C для отправки SIGINT;
10. Посмотрите на результат:
|
1 2 |
Привет Эхо: Привет |
11. Создайте файл reader.go со следующим содержимым:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import ( "fmt" "os" ) func main() { for { data := make([]byte, 8) n, err := os.Stdin.Read(data) if err == nil && n > 0 { process(data) } else { break } } } func process(data []byte) { fmt.Printf("Получено: %X %s\n", data, string(data)) } |
12. Выполните код через конвейерный ввод echo 'Go is awesome!' | go run reader.go;
13. Посмотрите на вывод:
|
1 2 3 |
echo 'Go is awesome!' | go run reader.go Получено: 6F20697320617765 Go is aw Получено: 736F6D652127207C esome! |
stdin в Go можно получить через Stdin из пакета os. По факту, это тип File, что имплементирует интерфейс Reader. Чтение из Reader очень простое. Предыдущий код показывает три самых частых случая того, как читать из Stdin.
Первая опция показывает, как использовать пакет fmt, что предоставляет функции Scan, Scanf и Scanln. Функция Scanf читает ввод и сохраняет его в переменную (или переменные). Преимущество Scanf в том, что вы можете определить формат сканируемого значения. Функция Scan только читает ввод и сохраняет его в переменную (без предварительного форматирования), а Scanln, как можно понять по названию, читает ввод, что заканчивается обрыванием строки \n.
Scanner, из второго примера, предоставляет удобный способ для сканирования более крупного ввода. Scanner содержит функцию Split, через которую можно определить настраиваемую функцию разделения строки. К примеру, для сканирования слов из stdin вы можете использовать bufio.ScanWords и предварительно определенный SplitFunc.
Чтение через API Reader является последним представленным подходом. Он предоставляет вам больше контроля над тем, как читать ввод и как его сохранять.

Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
Отличный урок!