Тип bufio.Scanner

Тип bufio.Scanner представляет собой сканер для чтения данных из ввода. Он автоматически разбивает входные данные на токены (по умолчанию на строки) и предоставляет удобный интерфейс для итерации. В первый параметр функция NewScanner принимает источник данных (реализующий интерфейс io.Reader), возвращает указатель на новый сканер.

Синтаксис

goscanner := bufio.NewScanner(reader)
for scanner.Scan() {
  text := scanner.Text()
  // обработка строки
}
if err := scanner.Err(); err != nil {
  // обработка ошибки
}

Пример

Давайте прочитаем построчно строку из нескольких строк:

gopackage main

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

func main() {
  data := "строка 1\nстрока 2\nстрока 3"
  scanner := bufio.NewScanner(strings.NewReader(data))

  for scanner.Scan() {
    fmt.Println(scanner.Text())
  }
}

Результат выполнения кода:

go"строка 1"
"строка 2"
"строка 3"

Пример

Давайте используем метод Bytes для получения сырых байтов:

gopackage main

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

func main() {
  data := "abcde\n12345"
  scanner := bufio.NewScanner(strings.NewReader(data))

  for scanner.Scan() {
    bytes := scanner.Bytes()
    fmt.Printf("%q\n", bytes)
  }
}

Результат выполнения кода:

go"abcde"
"12345"

Пример

Давайте проверим ошибку после сканирования:

gopackage main

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

func main() {
  data := "hello\nworld"
  scanner := bufio.NewScanner(strings.NewReader(data))

  for scanner.Scan() {
    fmt.Println(scanner.Text())
  }

  if err := scanner.Err(); err != nil {
    fmt.Printf("ошибка: %v\n", err)
  } else {
    fmt.Println("сканирование завершено успешно")
  }
}

Результат выполнения кода:

go"hello"
"world"
"сканирование завершено успешно"

Смотрите также

  • метод bufio.Scanner.Scan,
    который выполняет чтение следующего токена
  • метод bufio.Scanner.Text,
    который возвращает текущий токен как строку
  • метод bufio.Scanner.Bytes,
    который возвращает текущий токен как срез байтов
  • метод bufio.Scanner.Err,
    который возвращает ошибку сканирования