Функция io.ReadAtLeast

Функция io.ReadAtLeast читает данные из переданного ей ридера и заполняет переданный срез байт, пытаясь прочитать как минимум указанное минимальное количество байт. Первым параметром функция принимает ридер (объект, реализующий интерфейс io.Reader), вторым — срез байт для чтения данных, третьим — минимальное количество байт, которое необходимо прочитать. Функция возвращает два значения: количество фактически прочитанных байт и ошибку. Если ридер вернул ошибку до того, как было прочитано минимальное количество байт, функция возвращает ошибку io.ErrUnexpectedEOF. Если ридер вернул ошибку io.EOF до достижения минимального порога, возвращается io.ErrUnexpectedEOF, а не io.EOF.

Синтаксис

gofunc ReadAtLeast(r io.Reader, buf []byte, min int) (n int, err error)

Пример

Давайте прочитаем из строкового ридера не менее 5 байт:

gopackage main

import (
  "fmt"
  "io"
  "strings"
)

func main() {
  r := strings.NewReader("1234567890")
  buf := make([]byte, 10)

  n, err := io.ReadAtLeast(r, buf, 5)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  res := string(buf[:n])
  fmt.Println(res)
}

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

go"12345"

Пример

Попробуем прочитать из ридера не менее 15 байт, но в ридере всего 10 байт:

gopackage main

import (
  "fmt"
  "io"
  "strings"
)

func main() {
  r := strings.NewReader("1234567890")
  buf := make([]byte, 20)

  n, err := io.ReadAtLeast(r, buf, 15)
  if err != nil {
    fmt.Println("Error:", err)
    fmt.Println("Read bytes:", n)
    return
  }

  res := string(buf[:n])
  fmt.Println(res)
}

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

go"Error: unexpected EOF"
"Read bytes: 10"

Пример

Прочитаем ровно столько байт, сколько есть в ридере, используя переданный буфер:

gopackage main

import (
  "fmt"
  "io"
  "strings"
)

func main() {
  r := strings.NewReader("abcde")
  buf := make([]byte, 10)

  n, err := io.ReadAtLeast(r, buf, 5)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  res := string(buf[:n])
  fmt.Println(res)
}

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

go"abcde"

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

  • функцию io.ReadAll,
    которая читает все данные из ридера до EOF
  • функцию io.ReadFull,
    которая читает ровно указанное количество байт
  • функцию io.Copy,
    которая копирует данные из ридера в писатель
  • функцию io.LimitReader,
    которая ограничивает чтение до указанного количества байт