Когда какой метод ввода использовать: итоговые выводы

Краткое сравнение всех методов

У нас есть 5 способов считывания данных:

Метод Когда использовать Плюсы Минусы
fmt.Scan Простой ввод чисел/слов Автоконвертация типов ❌ Строки с пробелами
fmt.Scanln Несколько значений в одной строке Автоконвертация ❌ Останавливается на \n
fmt.Scanf Форматированный ввод (даты, координаты) Строгий формат Только для шаблонов
bufio.Reader Строки с пробелами Читает всё Нужен TrimSpace
bufio.Scanner Строки с пробелами Проще Reader, авто-убирает \n Только строки

Рекомендации по выбору

✅ Используйте fmt.Scan / Scanln

Когда:

  • Простой ввод чисел

  • Однословные строки

  • Несколько значений через пробел

  • Нужна автоматическая конвертация типов

go

var age int fmt.Scan(&age) // ✅ Просто и работает

✅ Используйте fmt.Scanf

Когда:

  • Нужен форматированный ввод

  • Данные с разделителями (дата, координаты)

  • Строгий шаблон ввода

go

var day, month, year int fmt.Scanf("%d-%d-%d", &day, &month, &year) // ✅ Для формата

✅ Используйте bufio.Scanner

Когда:

  • Строки с пробелами

  • Многострочный ввод

  • Нужен полный контроль

go

scanner := bufio.NewScanner(os.Stdin) scanner.Scan() text := scanner.Text() // ✅ Для строк с пробелами

✅ Используйте bufio.Reader

Когда:

  • Альтернатива Scanner

  • Нужен более низкоуровневый контроль

go

reader := bufio.NewReader(os.Stdin) text, _ := reader.ReadString('\n') text = strings.TrimSpace(text)

Ключевые различия

1. Автоконвертация типов

go

// ✅ Есть fmt.Scan(&age) // int автоматически // ❌ Нет (всегда string) scanner.Scan() text := scanner.Text() // Нужна ручная конвертация

2. Строки с пробелами

go

// ❌ Не работает fmt.Scan(&fullName) // "John" (только до пробела) // ✅ Работает scanner.Scan() fullName := scanner.Text() // "John Doe"

3. Форматированный ввод

go

// ✅ Scanf — лучший выбор fmt.Scanf("%d-%d-%d", &d, &m, &y) // ❌ Scanner/Reader — нужны регулярные выражения

Практические рекомендации

Сценарий 1: Калькулятор

// ✅ fmt.Scan — идеально для чисел var a, b int fmt.Scan(&a, &b)

Сценарий 2: Ввод даты

// ✅ fmt.Scanf — для формата var d, m, y int fmt.Scanf("%d-%d-%d", &d, &m, &y)

Сценарий 3: Ввод имени

// ✅ Scanner — для строк с пробелами scanner := bufio.NewScanner(os.Stdin) scanner.Scan() name := scanner.Text()

Сценарий 4: Анкета (смешанные типы)

// ✅ Комбинируйте методы var age int fmt.Scan(&age)  // Число scanner := bufio.NewScanner(os.Stdin) scanner.Scan() address := scanner.Text()  // Строка с пробелами

Итоговая таблица выбора

Что вводим Используем
Число fmt.Scan
Несколько чисел fmt.Scanln
Дата/формат fmt.Scanf
Слово fmt.Scan
Строка с пробелами bufio.Scanner
Многострочный текст bufio.Scanner

Главные выводы

  1. fmt.Scan/Scanln — для простых случаев (числа, слова)

  2. fmt.Scanf — для форматированного ввода (даты, координаты)

  3. bufio.Scanner — для строк с пробелами (имена, адреса)

  4. bufio.Reader — альтернатива Scanner

  5. Комбинируйте методы в зависимости от задачи

Золотое правило: начинайте с fmt.Scan, переходите на Scanner, если нужны пробелы! 🎯