Метод bufio.Reader.Discard

Метод bufio.Reader.Discard пропускает указанное количество байт из буферизованного потока чтения. Он полезен, когда нужно пропустить ненужные данные, не читая их в память. Метод принимает один параметр - количество байт, которое нужно пропустить, и возвращает количество реально пропущенных байт и возможную ошибку.

Синтаксис

gon, err := reader.Discard(n int) (int, error)

Пример

Давайте создадим буферизованный ридер и пропустим первые 5 байт из строки:

gopackage main

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

func main() {
  s := "Hello, World!"
  reader := bufio.NewReader(strings.NewReader(s))

  n, err := reader.Discard(5)
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Printf("Пропущено байт: %d\n", n)

  rest, _ := reader.ReadString('\n')
  fmt.Printf(rest)
}

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

go"Пропущено байт: 5"
", World!"

Пример

Давайте попробуем пропустить больше байт, чем содержится в потоке, и посмотрим на ошибку:

gopackage main

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

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

  n, err := reader.Discard(10)
  if err != nil {
    fmt.Printf("Ошибка: %v\n", err)
    fmt.Printf("Пропущено байт: %d\n", n)
    return
  }

  fmt.Printf("Пропущено байт: %d\n", n)
}

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

go"Ошибка: EOF"
"Пропущено байт: 5"

Пример

Метод Discard часто используется для пропуска заголовков или метаданных в потоке данных:

gopackage main

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

func main() {
  data := "HEADER: metadata\nbody content"
  reader := bufio.NewReader(strings.NewReader(data))

  // Пропускаем все символы до первой новой строки
  line, _ := reader.ReadString('\n')
  fmt.Printf("Заголовок: %s", line)

  // Пропускаем следующий байт (перевод строки)
  reader.Discard(1)

  // Читаем тело
  body, _ := reader.ReadString('\n')
  fmt.Printf(body)
}

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

go"Заголовок: HEADER: metadata"
"body content"

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

  • метод bufio.Reader.Read,
    который читает данные в буфер
  • метод bufio.Reader.Peek,
    который возвращает следующие байты без их потребления
  • метод bufio.Reader.ReadByte,
    который читает один байт из потока
  • метод bufio.Reader.Buffered,
    который возвращает количество доступных байт в буфере