Ответ
Стриминг (потоковая передача) данных — это подход к обработке данных, при котором они передаются и обрабатываются непрерывным потоком, по частям (чанками), а не загружаются целиком в память. Этот метод критически важен для работы с большими файлами, сетевыми соединениями или данными, поступающими в реальном времени.
В Go стриминг элегантно реализуется через интерфейсы io.Reader
(для чтения потока) и io.Writer
(для записи в поток).
Пример: обработка HTTP-запроса
Представим, что нужно скачать файл по URL и отдать его пользователю, не загружая весь файл в память сервера:
func downloadHandler(w http.ResponseWriter, r *http.Request) {
// Делаем запрос на получение файла
resp, err := http.Get("https://example.com/largefile.zip")
if err != nil {
http.Error(w, "Could not get file", http.StatusInternalServerError)
return
}
defer resp.Body.Close()
// resp.Body реализует io.Reader
// w (http.ResponseWriter) реализует io.Writer
// io.Copy эффективно копирует данные из Reader в Writer
// буферизованными чанками, не загружая всё в память.
_, err = io.Copy(w, resp.Body)
if err != nil {
// Обработка ошибки, если соединение прервалось
log.Printf("Failed to stream file: %v", err)
}
}
Ключевые преимущества стриминга:
- Низкое потребление памяти: Обрабатываются только небольшие фрагменты данных, что позволяет работать с файлами, превышающими объем ОЗУ.
- Быстрое начало обработки: Пользователь начинает получать первые байты данных сразу, не дожидаясь полной загрузки.
- Поддержка бесконечных потоков: Идеально подходит для обработки логов, данных с сенсоров или других непрерывных источников.