Ошибка bufio.ErrInvalidUnreadByte
Ошибка bufio.ErrInvalidUnreadByte возвращается методами
UnreadByte буферизованного чтения, когда вы пытаетесь
отменить чтение байта, но в буфере нет непрочитанных данных.
Эта ошибка возникает, если вы вызываете UnreadByte
после того, как предыдущая операция чтения завершилась неудачно,
или если вы вызываете ее повторно без промежуточного чтения.
Синтаксис
err := bufio.ErrInvalidUnreadByte
Пример возникновения ошибки
Попробуем вызвать UnreadByte без предварительного чтения:
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
reader := bufio.NewReader(strings.NewReader("abcde"))
// Попытка отменить чтение без чтения байта
err := reader.UnreadByte()
if err != nil {
fmt.Println(err)
}
}
Результат выполнения кода:
"bufio: invalid use of UnreadByte"
Пример корректного использования
Покажем, как правильно использовать UnreadByte после чтения:
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
reader := bufio.NewReader(strings.NewReader("abcde"))
// Читаем один байт
b, err := reader.ReadByte()
if err != nil {
fmt.Println("Error reading:", err)
return
}
fmt.Printf("Read byte: %c\n", b)
// Теперь можно отменить чтение
err = reader.UnreadByte()
if err != nil {
fmt.Println("Unread error:", err)
return
}
fmt.Println("UnreadByte called successfully")
// Читаем снова тот же байт
b2, err := reader.ReadByte()
if err != nil {
fmt.Println("Error reading second time:", err)
return
}
fmt.Printf("Read byte again: %c\n", b2)
}
Результат выполнения кода:
"Read byte: a"
"UnreadByte called successfully"
"Read byte again: a"
Пример ошибки при повторном вызове
Попробуем вызвать UnreadByte дважды подряд:
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
reader := bufio.NewReader(strings.NewReader("abcde"))
// Читаем один байт
_, err := reader.ReadByte()
if err != nil {
fmt.Println("Error reading:", err)
return
}
// Первый вызов UnreadByte - работает
err = reader.UnreadByte()
if err != nil {
fmt.Println("First UnreadByte failed:", err)
return
}
fmt.Println("First UnreadByte ok")
// Второй вызов UnreadByte - вызовет ошибку
err = reader.UnreadByte()
if err != nil {
fmt.Println("Second UnreadByte failed:", err)
}
}
Результат выполнения кода:
"First UnreadByte ok"
"Second UnreadByte failed: bufio: invalid use of UnreadByte"
Пример с проверкой на ошибку
Рекомендуется всегда проверять ошибку при вызове UnreadByte:
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
reader := bufio.NewReader(strings.NewReader("12345"))
// Читаем символ
b, err := reader.ReadByte()
if err != nil {
fmt.Println("Error reading:", err)
return
}
fmt.Printf("Read: %c\n", b)
// Пытаемся отменить чтение с проверкой
if err := reader.UnreadByte(); err != nil {
if err == bufio.ErrInvalidUnreadByte {
fmt.Println("Cannot unread: no byte was read")
} else {
fmt.Println("Other error:", err)
}
} else {
fmt.Println("Unread successful")
}
}
Результат выполнения кода:
"Read: 1"
"Unread successful"
Смотрите также
-
ошибку
bufio.ErrInvalidUnreadRune,
возникающую при попытке отменить чтение руны без предварительного чтения -
метод
bufio.Reader.UnreadByte,
который отменяет последнее чтение байта -
метод
bufio.Reader.ReadByte,
читающий один байт из буфера -
метод
bufio.Reader.Peek,
позволяющий заглянуть в буфер без чтения