Функция io.LimitReader

Функция io.LimitReader создает новый io.Reader, который читает не более n байт из переданного исходного Reader. Первым параметром функция принимает исходный Reader, вторым - максимальное количество байт, которое можно прочитать. После чтения указанного количества байт возвращается ошибка io.EOF.

Синтаксис

goio.LimitReader(r io.Reader, n int64) io.Reader

Пример

Давайте создадим ограниченный Reader для чтения только первых 5 байт из строки "1234567890":

gopackage main

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

func main() {
  r := strings.NewReader("1234567890")
  lr := io.LimitReader(r, 5)

  buf := make([]byte, 10)
  n, err := lr.Read(buf)

  fmt.Printf("read %d bytes: %s\n", n, buf[:n])
  fmt.Println("error:", err)
}

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

go"read 5 bytes: 12345"
"error: <nil>"

Как видно из примера, ограниченный Reader прочитал ровно 5 байт и не вернул ошибку, так как не достиг лимита. При следующем чтении будет возвращена ошибка io.EOF.

Пример

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

gopackage main

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

func main() {
  r := strings.NewReader("1234567890")
  lr := io.LimitReader(r, 3)

  buf := make([]byte, 10)

  n1, err1 := lr.Read(buf)
  fmt.Printf("first read: %d bytes, error: %v\n", n1, err1)
  fmt.Printf("data: %s\n", buf[:n1])

  n2, err2 := lr.Read(buf)
  fmt.Printf("second read: %d bytes, error: %v\n", n2, err2)
}

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

go"first read: 3 bytes, error: <nil>"
"data: 123"
"second read: 0 bytes, error: EOF"

При первом чтении были получены 3 байта без ошибки. При втором чтении лимит уже исчерпан, поэтому возвращается 0 байт и ошибка io.EOF.

Пример

Давайте используем io.LimitReader вместе с функцией io.ReadAll для чтения данных из строки с ограничением:

gopackage main

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

func main() {
  r := strings.NewReader("Hello, World! This is a long string.")
  lr := io.LimitReader(r, 5)

  data, err := io.ReadAll(lr)

  fmt.Printf("read %d bytes\n", len(data))
  fmt.Printf("data: %s\n", data)
  fmt.Println("error:", err)
}

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

go"read 5 bytes"
"data: Hello"
"error: <nil>"

Функция io.ReadAll прочитала все доступные данные из ограниченного Reader. Поскольку было разрешено только 5 байт, именно столько и было прочитано, а ошибки не возникло, так как чтение завершилось успешно.

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

  • функцию io.ReadAll,
    которая читает все данные из Reader до ошибки или EOF
  • функцию io.CopyN,
    которая копирует ровно N байт из Reader в Writer
  • функцию io.ReadFull,
    которая читает ровно указанное количество байт из Reader
  • функцию io.MultiReader,
    которая объединяет несколько Reader в один последовательный