Ввод и вывод данных в Go 1.21: подробное руководство
Ввод и вывод данных в Go
Что такое ввод и вывод и зачем это нужно?
Любая программа — это диалог с пользователем. Чтобы компьютер мог выполнить задачу, ему нужно получить данные (числа, текст) — это ввод. После обработки программа показывает результат — это вывод.
Представь, что ты — бариста в кафе. Клиент говорит тебе свой заказ (ввод), а ты готовишь напиток и отдаёшь его (вывод). В программировании всё точно так же!
Основной синтаксис: fmt и bufio
В Go для ввода и вывода есть два главных инструмента:
- fmt — для красивого вывода и простого ввода чисел
- bufio — для ввода целых строк (текста) с пробелами
Вывод данных: fmt.Println и fmt.Printf
package main
import "fmt"
func main() {
// Просто вывести текст
fmt.Println("Привет, мир!")
// Вывести число
fmt.Println(42)
// Вывести несколько значений через пробел
fmt.Println("Сумма:", 100+50)
// Форматированный вывод (подставляем значения)
name := "Аня"
age := 12
fmt.Printf("Меня зовут %s, мне %d лет.\n", name, age)
// %s — для строки, %d — для целого числа, \n — переход на новую строку
}
Что выведет:
Привет, мир!
42
Сумма: 150
Меня зовут Аня, мне 12 лет.
Ввод чисел: fmt.Scan
Функция fmt.Scan считывает числа или слова, разделённые пробелами или переносом строки.
package main
import "fmt"
func main() {
var age int
fmt.Print("Сколько тебе лет? ")
fmt.Scan(&age) // & — это "адрес" переменной, куда сохранить число
fmt.Println("Тебе", age, "лет!")
}
Пример работы:
Сколько тебе лет? 12
Тебе 12 лет!
Ввод строки с пробелами: bufio.Scanner
Если нужно ввести целое предложение (например, "кофе с молоком"), используем bufio:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Введите ваш заказ: ")
scanner.Scan() // ждём ввод
order := scanner.Text() // получаем текст
fmt.Println("Ваш заказ:", order)
}
Пример работы:
Введите ваш заказ: большой капучино
Ваш заказ: большой капучино
Разбор типичных задач
Задача 1: Определение возраста
Нужно узнать год рождения и текущий год, вычислить возраст.
package main
import "fmt"
func main() {
var birthYear, currentYear int
fmt.Print("Введите год рождения: ")
fmt.Scan(&birthYear)
fmt.Print("Введите текущий год: ")
fmt.Scan(¤tYear)
age := currentYear - birthYear
fmt.Println("Ваш возраст:", age, "лет")
}
Ввод: 2012 2024 → Вывод: Ваш возраст: 12 лет
Задача 2: Площадь прямоугольника
Вводим длину и ширину, перемножаем. Числа могут быть дробными, поэтому используем float64.
package main
import "fmt"
func main() {
var length, width float64
fmt.Print("Введите длину: ")
fmt.Scan(&length)
fmt.Print("Введите ширину: ")
fmt.Scan(&width)
area := length * width
fmt.Printf("Площадь прямоугольника: %.2f\n", area)
// %.2f — число с двумя знаками после запятой
}
Ввод: 5.5 3.2 → Вывод: Площадь прямоугольника: 17.60
Задача 3: Периметр треугольника
Складываем три стороны.
package main
import "fmt"
func main() {
var a, b, c float64
fmt.Print("Введите три стороны через пробел: ")
fmt.Scan(&a, &b, &c) // можно считывать сразу несколько чисел
perimeter := a + b + c
fmt.Println("Периметр треугольника:", perimeter)
}
Ввод: 3 4 5 → Вывод: Периметр треугольника: 12
Частые ошибки новичков
- Забыл & перед переменной в fmt.Scan — программа не изменит значение. Правильно:
fmt.Scan(&x). - Путает типы данных — если переменная
int, а пользователь вводит 3.5, произойдёт ошибка. Для дробей используйfloat64. - Не импортирует bufio — при использовании
bufio.NewScannerнужно добавить"bufio"и"os"в import. - Игнорирует перенос строки — после
fmt.Scanв буфере может остаться\n. Если дальше читаешь строку черезbufio, вызовиscanner.Scan()один раз "впустую".
Итоговый пример: "Уютное кафе"
Программа запрашивает имя, напиток и размер порции, а затем выводит готовый заказ.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Ввод имени
fmt.Print("Введите ваше имя: ")
scanner.Scan()
name := scanner.Text()
// Ввод напитка
fmt.Print("Выберите напиток (кофе, чай, какао): ")
scanner.Scan()
drink := scanner.Text()
// Ввод размера (число)
var size int
fmt.Print("Размер порции (1 - маленький, 2 - средний, 3 - большой): ")
fmt.Scan(&size)
// Определяем название размера
var sizeName string
if size == 1 {
sizeName = "маленький"
} else if size == 2 {
sizeName = "средний"
} else {
sizeName = "большой"
}
// Вывод результата
fmt.Println("--- ВАШ ЗАКАЗ ---")
fmt.Printf("Посетитель: %s\n", name)
fmt.Printf("Напиток: %s\n", drink)
fmt.Printf("Размер: %s\n", sizeName)
fmt.Println("Приятного аппетита!")
}
Пример работы:
Введите ваше имя: Маша
Выберите напиток (кофе, чай, какао): какао
Размер порции (1 - маленький, 2 - средний, 3 - большой): 2
--- ВАШ ЗАКАЗ ---
Посетитель: Маша
Напиток: какао
Размер: средний
Приятного аппетита!
Коротко о главном
fmt.Scan(&variable)— ввод чисел и коротких словbufio.Scanner— ввод целых строк с пробеламиfmt.Println(...)— вывод с переносом строкиfmt.Printf(...)— форматированный вывод (подстановка значений)- Не забывай про
&и импорт нужных пакетов!
Теперь ты готов автоматизировать любое кафе, посчитать любую площадь и узнать возраст любого человека. Удачи в программировании!