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

Функция io.ReadFull

Функция io.ReadFull читает из ридера ровно указанное количество байт в буфер. В первый параметр передается интерфейс io.Reader, из которого происходит чтение. Во второй параметр передается байтовый срез (буфер), куда будут записаны прочитанные данные. Третьим параметром передается количество байт, которое необходимо прочитать. Функция возвращает количество фактически прочитанных байт и ошибку. Если было прочитано меньше байт, чем запрошено, функция возвращает ошибку io.ErrUnexpectedEOF. Если ридер не вернул ни одного байта, возвращается ошибка io.EOF. В отличие от обычного чтения через Read, эта функция гарантирует, что буфер будет полностью заполнен.

Синтаксис

io.ReadFull(r, buf)

Пример обычного чтения

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

package main import ( "fmt" "io" "strings" ) func main() { r := strings.NewReader("abcdefghij") buf := make([]byte, 5) n, err := io.ReadFull(r, buf) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Read %d bytes: %s\n", n, buf) }

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

"Read 5 bytes: abcde"

Пример с недостаточным количеством данных

Попробуем прочитать 10 байт из строки, которая содержит всего 5 байт:

package main import ( "fmt" "io" "strings" ) func main() { r := strings.NewReader("abcde") buf := make([]byte, 10) n, err := io.ReadFull(r, buf) if err != nil { fmt.Printf("Error: %v\n", err) fmt.Printf("Read %d bytes: %s\n", n, buf[:n]) return } fmt.Printf("Read %d bytes: %s\n", n, buf) }

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

"Error: unexpected EOF" "Read 5 bytes: abcde"

Пример с пустым ридером

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

package main import ( "fmt" "io" "strings" ) func main() { r := strings.NewReader("") buf := make([]byte, 5) n, err := io.ReadFull(r, buf) if err != nil { fmt.Printf("Error: %v\n", err) fmt.Printf("Read %d bytes\n", n) return } fmt.Printf("Read %d bytes: %s\n", n, buf) }

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

"Error: EOF" "Read 0 bytes"

Пример с файлом

Прочитаем ровно 10 байт из файла:

package main import ( "fmt" "io" "os" ) func main() { file, err := os.Open("example.txt") if err != nil { fmt.Println("Error:", err) return } defer file.Close() buf := make([]byte, 10) n, err := io.ReadFull(file, buf) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Read %d bytes: %s\n", n, buf) }

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

"Read 10 bytes: Hello World"

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

  • функцию io.ReadAll,
    которая читает все данные до конца потока
  • функцию io.ReadAtLeast,
    которая читает как минимум указанное количество байт
  • функцию io.Copy,
    которая копирует данные из одного потока в другой
  • функцию io.LimitReader,
    которая создает ридер с ограничением на количество читаемых байт
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить