Вести с Полей
Канал с советами по современной ИИ разработке. Вступайте!
563 of 1593 menu
◀ ▶

Интерфейс io.Reader

Интерфейс io.Reader представляет любой источник данных, из которого можно читать байты. Этот интерфейс используется повсеместно в стандартной библиотеке Go для работы с файлами, сетевыми соединениями, строками, буферами и другими потоками данных. Основной метод интерфейса — Read, который принимает в качестве аргумента байтовый срез и возвращает количество прочитанных байтов и ошибку.

Метод Read считывает данные в переданный срез p и возвращает количество прочитанных байтов n. Если достигнут конец данных, метод возвращает ошибку io.EOF. Важно отметить, что метод может вернуть меньше байтов, чем размер среза, даже если данные еще не закончились.

Синтаксис

type Reader interface { Read(p []byte) (n int, err error) }

Пример

Давайте прочитаем данные из строки с помощью strings.NewReader, который возвращает io.Reader:

package main import ( "fmt" "io" "strings" ) func main() { r := strings.NewReader("abcde") buf := make([]byte, 2) for { n, err := r.Read(buf) if err == io.EOF { break } if err != nil { fmt.Println(err) return } fmt.Printf("%s", string(buf[:n])) } }

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

"abcde"

Пример

Прочитаем данные из файла с помощью os.Open, который возвращает *os.File, реализующий io.Reader:

package main import ( "fmt" "io" "os" ) func main() { file, err := os.Open("test.txt") if err != nil { fmt.Println(err) return } defer file.Close() buf := make([]byte, 5) for { n, err := file.Read(buf) if err == io.EOF { break } if err != nil { fmt.Println(err) return } fmt.Print(string(buf[:n])) } }

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

"Hello, World!"

Пример

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

package main import ( "fmt" "io" "strings" ) func main() { r := strings.NewReader("12345") data, err := io.ReadAll(r) if err != nil { fmt.Println(err) return } fmt.Printf("%s", data) }

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

"12345"

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

  • интерфейс io.Writer,
    который используется для записи данных в поток
  • интерфейс io.Closer,
    который предоставляет метод Close для закрытия ресурсов
  • функцию io.ReadAll,
    которая читает все данные из Reader до EOF
  • функцию io.Copy,
    которая копирует данные из Reader в Writer
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить