Ошибка bufio.ErrInvalidUnreadByte

Ошибка bufio.ErrInvalidUnreadByte возвращается методами UnreadByte буферизованного чтения, когда вы пытаетесь отменить чтение байта, но в буфере нет непрочитанных данных. Эта ошибка возникает, если вы вызываете UnreadByte после того, как предыдущая операция чтения завершилась неудачно, или если вы вызываете ее повторно без промежуточного чтения.

Синтаксис

goerr := bufio.ErrInvalidUnreadByte

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

Попробуем вызвать UnreadByte без предварительного чтения:

gopackage main

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

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

  // Попытка отменить чтение без чтения байта
  err := reader.UnreadByte()
  if err != nil {
    fmt.Println(err)
  }
}

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

go"bufio: invalid use of UnreadByte"

Пример корректного использования

Покажем, как правильно использовать UnreadByte после чтения:

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

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

go"Read byte: a"
"UnreadByte called successfully"
"Read byte again: a"

Пример ошибки при повторном вызове

Попробуем вызвать UnreadByte дважды подряд:

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

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

go"First UnreadByte ok"
"Second UnreadByte failed: bufio: invalid use of UnreadByte"

Пример с проверкой на ошибку

Рекомендуется всегда проверять ошибку при вызове UnreadByte:

gopackage 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")
  }
}

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

go"Read: 1"
"Unread successful"

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

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