РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
722 of 1593 menu

Ошибка bufio.ErrInvalidUnreadRune

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

Синтаксис

err := reader.UnreadRune()

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

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

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

package 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) } }

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

"bufio: invalid use of UnreadRune"

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

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

package 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) }

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

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

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

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

package 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("Руна успешно возвращена в буфер") }

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

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

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

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