Когда какой метод ввода использовать: итоговые выводы
Краткое сравнение всех методов
У нас есть 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 |
Главные выводы
-
fmt.Scan/Scanln— для простых случаев (числа, слова) -
fmt.Scanf— для форматированного ввода (даты, координаты) -
bufio.Scanner— для строк с пробелами (имена, адреса) -
bufio.Reader— альтернатива Scanner -
Комбинируйте методы в зависимости от задачи
Золотое правило: начинайте с fmt.Scan, переходите на Scanner, если нужны пробелы! 🎯