Функция bufio.ScanRunes

Функция bufio.ScanRunes является функцией разделения (split function) для bufio.Scanner. Она определяет правило, по которому сканер будет разбивать входные данные на токены. В отличие от ScanLines или ScanWords, эта функция разбивает данные по рунам (Unicode code points), возвращая каждый символ как отдельный токен.

Функция не принимает параметров и используется исключительно в качестве значения для метода Split сканера.

Синтаксис

goscanner.Split(bufio.ScanRunes)

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

Давайте прочитаем строку "Hello, 世界" по рунам с помощью bufio.ScanRunes:

gopackage main

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

func main() {
  data := "Hello, 世界"
  scanner := bufio.NewScanner(strings.NewReader(data))
  scanner.Split(bufio.ScanRunes)

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

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

go"H" "e" "l" "l" "o" "," " " "世" "界"

Пример с обработкой ошибок

При работе со сканером важно проверять наличие ошибок после завершения цикла. Рассмотрим пример:

gopackage main

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

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

  for scanner.Scan() {
    token := scanner.Text()
    fmt.Println(token)
  }

  if err := scanner.Err(); err != nil {
    fmt.Printf("Error: %v\n", err)
  }
}

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

go"a"
"b"
"c"
"d"
"e"

Пример с многобайтовыми символами

Функция корректно обрабатывает многобайтовые символы Unicode, такие как эмодзи или иероглифы. Давайте посмотрим на примере:

gopackage main

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

func main() {
  data := "🚀🌟⭐"
  scanner := bufio.NewScanner(strings.NewReader(data))
  scanner.Split(bufio.ScanRunes)

  var tokens []string
  for scanner.Scan() {
    tokens = append(tokens, scanner.Text())
  }

  fmt.Printf("Runes: %v\n", tokens)
  fmt.Printf("Count: %d\n", len(tokens))
}

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

go"Runes: [🚀 🌟 ⭐]"
"Count: 3"

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

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