🐹 Go

Ввод и вывод данных в 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(&currentYear)

    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(...) — форматированный вывод (подстановка значений)
  • Не забывай про & и импорт нужных пакетов!

Теперь ты готов автоматизировать любое кафе, посчитать любую площадь и узнать возраст любого человека. Удачи в программировании!