Функция bufio.ScanLines

Функция bufio.ScanLines представляет собой функцию разделения (split function) для использования с bufio.Scanner. Она определяет границы строк в данных, используя символ новой строки '\n' в качестве разделителя. Эта функция возвращает true для каждого токена и false, когда достигнут конец данных. Она автоматически обрабатывает различные окончания строк, включая \n, \r\n и \r, что делает её универсальным инструментом для построчного чтения текстовых данных.

Синтаксис

gobufio.ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error)

Параметры

Функция принимает два параметра: срез байтов data для сканирования и булево значение atEOF, указывающее, достигнут ли конец данных. Возвращает три значения: количество байтов для перемещения вперёд advance, найденный токен token и возможную ошибку err.

Пример использования с Scanner

Давайте создадим сканер для чтения многострочного текста и установим функцию разделения ScanLines:

gopackage main

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

func main() {
  text := "Line 1\nLine 2\nLine 3\n"
  scanner := bufio.NewScanner(strings.NewReader(text))
  scanner.Split(bufio.ScanLines)

  for scanner.Scan() {
    fmt.Printf("%q\n", scanner.Text())
  }
}

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

go"Line 1"
"Line 2"
"Line 3"

Пример с Windows окончаниями строк

Рассмотрим обработку текста с разделителями \r\n:

gopackage main

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

func main() {
  text := "First line\r\nSecond line\r\nThird line"
  scanner := bufio.NewScanner(strings.NewReader(text))
  scanner.Split(bufio.ScanLines)

  for scanner.Scan() {
    fmt.Printf("%q\n", scanner.Text())
  }
}

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

go"First line"
"Second line"
"Third line"

Пример с чтением из файла

Покажем, как использовать ScanLines для построчного чтения файла:

gopackage main

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

func main() {
  file, err := os.Open("input.txt")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer file.Close()

  scanner := bufio.NewScanner(file)
  scanner.Split(bufio.ScanLines)

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

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

  • функцию bufio.Scanner.Split,
    которая устанавливает функцию разделения для сканера
  • функцию bufio.ScanWords,
    которая разделяет данные по словам
  • функцию bufio.ScanRunes,
    которая разделяет данные по рунам Unicode
  • функцию bufio.ScanBytes,
    которая разделяет данные по байтам