РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
582 of 1593 menu

Функция 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 в один последовательный
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить