Метод bufio.Scanner.Bytes
Метод Bytes структуры bufio.Scanner возвращает
текущий токен, полученный после вызова метода Scan,
в виде среза байт. Этот метод полезен, когда вам нужно
работать с данными как с байтами, а не как со строкой.
Возвращаемый срез является ссылкой на внутренний буфер
сканера, поэтому его данные могут быть изменены при
следующем вызове Scan.
Синтаксис
scanner.Bytes() []byte
Пример использования с разделителем по словам
Давайте разберем базовый пример использования метода
Bytes для получения токенов из строки, разделенных
пробелами:
package 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)
}
}
Результат выполнения кода:
"hello world go "
Пример с разделением по строкам
Рассмотрим пример использования метода Bytes для
чтения построчного вывода программы:
package 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)
}
}
Результат выполнения кода:
"Line: first line"
"Line: second line"
"Line: third line"
Пример получения среза байт и его копирования
Важно помнить, что срез, возвращаемый методом Bytes,
является ссылкой на внутренний буфер. Если нужно сохранить
данные для последующего использования, следует сделать их
копию:
package 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)
}
}
Результат выполнения кода:
"data1 data2 data3 "
Пример сравнения с методом Text
Покажем разницу между методами Bytes и Text.
Первый возвращает срез байт, а второй - строку:
package 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)
}
}
Результат выполнения кода:
"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,
который возвращает ошибку сканера, если она возникла