Функция io.LimitReader
Функция io.LimitReader создает новый io.Reader,
который читает не более n байт из переданного
исходного Reader. Первым параметром функция принимает
исходный Reader, вторым - максимальное количество байт,
которое можно прочитать. После чтения указанного количества
байт возвращается ошибка io.EOF.
Синтаксис
io.LimitReader(r io.Reader, n int64) io.Reader
Пример
Давайте создадим ограниченный Reader для чтения только первых 5 байт из строки "1234567890":
package 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)
}
Результат выполнения кода:
"read 5 bytes: 12345"
"error: <nil>"
Как видно из примера, ограниченный Reader прочитал
ровно 5 байт и не вернул ошибку, так как не достиг
лимита. При следующем чтении будет возвращена ошибка
io.EOF.
Пример
Давайте попробуем прочитать больше байт, чем разрешено лимитом, чтобы увидеть поведение при достижении предела:
package 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)
}
Результат выполнения кода:
"first read: 3 bytes, error: <nil>"
"data: 123"
"second read: 0 bytes, error: EOF"
При первом чтении были получены 3 байта без ошибки.
При втором чтении лимит уже исчерпан, поэтому возвращается
0 байт и ошибка io.EOF.
Пример
Давайте используем io.LimitReader вместе с
функцией io.ReadAll для чтения данных из строки
с ограничением:
package 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)
}
Результат выполнения кода:
"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 в один последовательный