Метод bufio.Scanner.Bytes

Метод Bytes структуры bufio.Scanner возвращает текущий токен, полученный после вызова метода Scan, в виде среза байт. Этот метод полезен, когда вам нужно работать с данными как с байтами, а не как со строкой. Возвращаемый срез является ссылкой на внутренний буфер сканера, поэтому его данные могут быть изменены при следующем вызове Scan.

Синтаксис

goscanner.Bytes() []byte

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

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

gopackage main

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

func main() {
  str := "hello world go"
  scanner := bufio.NewScanner(strings.NewReader(str))
  scanner.Split(bufio.ScanWords)

  for scanner.Scan() {
    token := scanner.Bytes()
    fmt.Printf("%s ", token)
  }
}

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

go"hello world go "

Пример с разделением по строкам

Рассмотрим пример использования метода Bytes для чтения построчного вывода программы:

gopackage main

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

func main() {
  str := "first line\nsecond line\nthird line"
  scanner := bufio.NewScanner(strings.NewReader(str))

  for scanner.Scan() {
    line := scanner.Bytes()
    fmt.Printf("Line: %s\n", line)
  }
}

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

go"Line: first line"
"Line: second line"
"Line: third line"

Пример получения среза байт и его копирования

Важно помнить, что срез, возвращаемый методом Bytes, является ссылкой на внутренний буфер. Если нужно сохранить данные для последующего использования, следует сделать их копию:

gopackage main

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

func main() {
  str := "data1 data2 data3"
  scanner := bufio.NewScanner(strings.NewReader(str))
  scanner.Split(bufio.ScanWords)

  var tokens [][]byte

  for scanner.Scan() {
    token := scanner.Bytes()
    copyToken := make([]byte, len(token))
    copy(copyToken, token)
    tokens = append(tokens, copyToken)
  }

  for _, token := range tokens {
    fmt.Printf("%s ", token)
  }
}

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

go"data1 data2 data3 "

Пример сравнения с методом Text

Покажем разницу между методами Bytes и Text. Первый возвращает срез байт, а второй - строку:

gopackage main

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

func main() {
  str := "12345"
  scanner := bufio.NewScanner(strings.NewReader(str))
  scanner.Split(bufio.ScanRunes)

  for scanner.Scan() {
    b := scanner.Bytes()
    t := scanner.Text()
    fmt.Printf("Bytes: %v, Text: %s\n", b, t)
  }
}

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

go"Bytes: [49], Text: 1"
"Bytes: [50], Text: 2"
"Bytes: [51], Text: 3"
"Bytes: [52], Text: 4"
"Bytes: [53], Text: 5"

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

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