Ошибка 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,
которая возникает при превышении размера буфера