Чтение строк через bufio.Scanner

Краткое описание

Альтернатива bufio.Reader для чтения строк с пробелами. bufio.Scanner проще в использовании и автоматически убирает \n в конце строки.

Два способа чтения строк

Способ 1: bufio.Reader (предыдущий)

reader := bufio.NewReader(os.Stdin)
fullName, _ := reader.ReadString('\n')
fullName = strings.TrimSpace(fullName)  // Нужен TrimSpace!

Способ 2: bufio.Scanner (новый)

scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
fullName := scanner.Text()
// TrimSpace не обязателен (но можно добавить)

Базовый пример

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    
    fmt.Print("Введите имя с пробелами: ")
    scanner.Scan()
    fullName := scanner.Text()
    
    fmt.Printf("Результат: %s\n", fullName)
}

Как работает Scanner

Шаг 1: Создать scanner

scanner := bufio.NewScanner(os.Stdin)

Шаг 2: Прочитать строку

scanner.Scan()  // Читает до Enter

Шаг 3: Получить текст

text := scanner.Text()  // Получить прочитанную строку

Преимущество Scanner

Автоматически убирает \n:

scanner.Scan()
text := scanner.Text()
fmt.Printf(">>%s<<\n", text)
// Ввод: "John Doe"
// Вывод: >>John Doe<<  ✅ (нет \n в конце!)

Сравните с Reader:

text, _ := reader.ReadString('\n')
fmt.Printf(">>%s<<\n", text)
// Вывод: >>John Doe
//        <<  ❌ (есть \n!)

Пробелы в начале и конце

Scanner сохраняет пробелы с краёв:

scanner.Scan()
text := scanner.Text()
// Ввод: "   John Doe   "
// Результат: "   John Doe   " (пробелы сохранены)

Если нужно убрать — используйте TrimSpace:

scanner.Scan()
text := scanner.Text()
text = strings.TrimSpace(text)
// Результат: "John Doe" ✅

Полный пример с TrimSpace

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    
    fmt.Print("Введите имя: ")
    scanner.Scan()
    fullName := scanner.Text()
    fullName = strings.TrimSpace(fullName)
    
    fmt.Printf("Результат: >>>%s<<<\n", fullName)
}

Ввод: ` много пробелов ! `
Вывод: >>>много пробелов !<<< (края очищены, внутренние пробелы остались)

Сравнение Reader vs Scanner

Особенность Reader Scanner
Создание bufio.NewReader(os.Stdin) bufio.NewScanner(os.Stdin)
Чтение ReadString('\n') Scan()
Получение Сразу возвращает Text()
\n в конце ✅ Есть ❌ Нет
TrimSpace Обязателен Опционален

Шаблон использования

// 1. Импорты
import (
    "bufio"
    "os"
    "strings"  // Опционально для TrimSpace
)

// 2. Создать scanner (один раз)
scanner := bufio.NewScanner(os.Stdin)

// 3. Читать строки
scanner.Scan()
text1 := scanner.Text()

scanner.Scan()
text2 := scanner.Text()

// 4. Опционально: убрать пробелы с краёв
text1 = strings.TrimSpace(text1)

Ключевые моменты

1. Scanner автоматически убирает \n

Не нужно вручную удалять перенос строки.

2. Три шага работы

scanner := bufio.NewScanner(os.Stdin)  // Создать
scanner.Scan()                         // Прочитать
text := scanner.Text()                 // Получить

3. TrimSpace опционален

Но полезен для удаления лишних пробелов с краёв.

4. Проще, чем Reader

Меньше кода, нет необходимости обрабатывать \n.

5. Работает с пробелами

// Ввод: "John Doe Smith"
// Результат: "John Doe Smith" ✅

Что запомнить

  • bufio.NewScanner(os.Stdin) — создать scanner
  • scanner.Scan() — прочитать строку
  • scanner.Text() — получить текст
  • Scanner автоматически убирает \n
  • TrimSpace нужен только для пробелов с краёв
  • Проще, чем Reader
  • Пробелы внутри строки сохраняются

Рекомендация

Для чтения строк с пробелами используйте Scanner — он проще и удобнее:

scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
text := scanner.Text()
text = strings.TrimSpace(text)  // Опционально

Готово! 🎯