Ошибка bufio.ErrInvalidUnreadRune

Ошибка bufio.ErrInvalidUnreadRune возникает, когда вызывается метод UnreadRune у объекта bufio.Reader, но последняя операция чтения не была выполнена методом ReadRune. Это означает, что буфер не содержит последней прочитанной руны, которую можно было бы вернуть обратно в поток.

Синтаксис

goerr := reader.UnreadRune()

Метод UnreadRune не принимает аргументов и возвращает ошибку типа error. Если операция успешна, возвращается nil.

Пример возникновения ошибки

Давайте рассмотрим ситуацию, когда после чтения байта методом ReadByte мы пытаемся отменить чтение руны с помощью UnreadRune:

gopackage main

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

func main() {
  r := strings.NewReader("abc")
  reader := bufio.NewReader(r)

  _, err := reader.ReadByte()
  if err != nil {
    fmt.Println("Ошибка чтения байта")
    return
  }

  err = reader.UnreadRune()
  if err != nil {
    fmt.Println(err)
  }
}

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

go"bufio: invalid use of UnreadRune"

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

Метод UnreadRune должен вызываться только после успешного вызова ReadRune. Вот корректный пример использования:

gopackage main

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

func main() {
  r := strings.NewReader("абв")
  reader := bufio.NewReader(r)

  rune, size, err := reader.ReadRune()
  if err != nil {
    fmt.Println("Ошибка чтения руны")
    return
  }

  fmt.Printf("Прочитана руна: %c, размер: %d\n", rune, size)

  err = reader.UnreadRune()
  if err != nil {
    fmt.Println(err)
    return
  }

  rune2, size2, err := reader.ReadRune()
  if err != nil {
    fmt.Println("Ошибка чтения руны")
    return
  }

  fmt.Printf("Руна после возврата: %c, размер: %d\n", rune2, size2)
}

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

go"Прочитана руна: а, размер: 2"
"Руна после возврата: а, размер: 2"

Обработка ошибки

При возникновении ошибки ErrInvalidUnreadRune рекомендуется проверять последнюю операцию чтения. Если вы точно знаете, что последним был вызван ReadRune, то ошибка может указывать на проблемы с буфером или состоянием ридера:

gopackage main

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

func main() {
  r := strings.NewReader("123")
  reader := bufio.NewReader(r)

  _, err := reader.ReadRune()
  if err != nil {
    fmt.Println("Ошибка чтения руны")
    return
  }

  err = reader.UnreadRune()
  if err == bufio.ErrInvalidUnreadRune {
    fmt.Println("Нельзя отменить чтение руны")
    return
  }

  if err != nil {
    fmt.Printf("Другая ошибка: %v\n", err)
    return
  }

  fmt.Println("Руна успешно возвращена в буфер")
}

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

go"Руна успешно возвращена в буфер"

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

  • ошибку bufio.ErrInvalidUnreadByte,
    которая возникает при неверном использовании UnreadByte
  • метод bufio.Reader.ReadRune,
    который читает следующую руну из буфера
  • метод bufio.Reader.UnreadByte,
    который отменяет чтение последнего байта
  • ошибку bufio.ErrTooLong,
    которая возникает при превышении размера буфера