Метод bufio.Reader.ReadRune

Метод ReadRune типа bufio.Reader читает один символ Unicode (руну) из буферизированного потока данных. В отличие от методов чтения байтов, он корректно обрабатывает многобайтовые символы UTF-8. Метод возвращает три значения: прочитанную руну, количество байт, которые она занимает в кодировке UTF-8, и ошибку. Если чтение выполнено успешно, ошибка будет равна nil.

Синтаксис

gofunc (b *bufio.Reader) ReadRune() (r rune, size int, err error)

Пример

Давайте прочитаем первый символ из строки "Привет":

gopackage main

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

func main() {
  s := "Привет"
  reader := bufio.NewReader(strings.NewReader(s))

  r, size, err := reader.ReadRune()
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("Символ: %c, байт: %d\n", r, size)
}

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

go"Символ: П, байт: 2"

В этом примере метод правильно определил, что символ "П" занимает 2 байта в UTF-8.

Пример

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

gopackage main

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

func main() {
  s := "Hello"
  reader := bufio.NewReader(strings.NewReader(s))

  for i := 0; i < 3; i++ {
    r, size, err := reader.ReadRune()
    if err != nil {
      fmt.Println("Error:", err)
      break
    }
    fmt.Printf("Символ %d: %c, байт: %d\n", i+1, r, size)
  }
}

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

go"Символ 1: H, байт: 1"
"Символ 2: e, байт: 1"
"Символ 3: l, байт: 1"

В этом примере все символы английского алфавита занимают по 1 байту.

Пример

Давайте прочитаем символы из строки "🔤ABC" и обработаем возможные ошибки:

gopackage main

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

func main() {
  s := "🔤ABC"
  reader := bufio.NewReader(strings.NewReader(s))

  for {
    r, size, err := reader.ReadRune()
    if err != nil {
      fmt.Println("End of input or error:", err)
      break
    }
    fmt.Printf("Символ: %c, байт: %d\n", r, size)
  }
}

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

go"Символ: 🔤, байт: 4"
"Символ: A, байт: 1"
"Символ: B, байт: 1"
"Символ: C, байт: 1"
"End of input or error: EOF"

В этом примере эмодзи занимает 4 байта, а буквы английского алфавита по 1 байту. Когда метод достигает конца потока, он возвращает ошибку io.EOF.

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

  • метод bufio.Reader.ReadByte,
    который читает один байт из потока
  • метод bufio.Reader.ReadString,
    который читает строку до заданного разделителя
  • метод bufio.Reader.ReadBytes,
    который читает байты до заданного разделителя
  • метод bufio.Reader.ReadLine,
    который читает одну строку из потока