Ошибка bufio.ErrAdvanceTooFar

Ошибка bufio.ErrAdvanceTooFar возвращается методами буферизованного чтения, когда запрошенный сдвиг (advance) превышает размер буфера или доступных данных. Этот тип ошибки определен в пакете bufio и возникает при работе с bufio.Reader, когда методы пытаются пропустить больше байт, чем доступно в текущем буфере.

Синтаксис

govar ErrAdvanceTooFar = errors.New("bufio: advance too far")

Ошибка возвращается методами, которые принимают параметр advance - количество байт для пропуска. Если это значение больше размера буфера или превышает количество непрочитанных байт, возникает ошибка.

Пример

Попытка пропустить больше байт, чем содержит буфер:

gopackage main

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

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

  // Пытаемся пропустить 10 байт, хотя данных всего 5
  _, err := br.Discard(10)
  if err != nil {
    fmt.Println(err)
  }
}

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

go"bufio: advance too far"

Пример

Обработка ошибки ErrAdvanceTooFar при чтении с помощью метода Peek:

gopackage main

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

func main() {
  r := strings.NewReader("hello")
  br := bufio.NewReader(r)

  // Пытаемся заглянуть на 20 байт вперед
  buf, err := br.Peek(20)
  if err != nil {
    fmt.Println("Error:", err)
    if err == bufio.ErrAdvanceTooFar {
      fmt.Println("Advance size exceeds buffer limit")
    }
  } else {
    fmt.Println(string(buf))
  }
}

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

go"Error: bufio: advance too far"
"Advance size exceeds buffer limit"

Пример

Корректная обработка данных без ошибки при использовании правильного размера сдвига:

gopackage main

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

func main() {
  r := strings.NewReader("12345")
  br := bufio.NewReader(r)

  // Пропускаем 3 байта (данных достаточно)
  _, err := br.Discard(3)
  if err != nil {
    fmt.Println(err)
    return
  }

  // Читаем оставшиеся данные
  remaining, _ := br.ReadString('\n')
  fmt.Println(remaining)
}

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

go"45"

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

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