Библиотека Go (Golang) разработчика
Библиотека Go (Golang) разработчика
1 972 подписчиков · @golang_lib
К каналу →
Базовый стек межсервисного взаимодействия и наблюдаемости: HTTP(S), gRPC, Protobuf и OpenTelemetry Современная микросервисная архитектура требует стандартизированных подходов к тр…
Читать далее →
357
Реклама
Как спасти сборщик мусора от перегрева: используем sync.Pool 🛟 В продолжение темы про аллокации в куче. Если ваш высоконагруженный бэкенд создает тысячи временных объектов в секун…
Читать далее →
265

🌊 io.

🌊 io.Reader и io.Writer: Лего для взрослых (и спасение от OOM)

Знакомый сценарий: микросервис скачивает отчет из внешней системы. Когда вы его писали, отчет весил 5 МБ. Через полгода бизнес вырос, отчет весит 5 ГБ. Ваш под в Kubernetes ловит OOM (Out Of Memory) и бесславно умирает.

Что делает в такой ситуации джуниор? Пытается увеличить лимиты памяти в Helm-чартах.
Почему так вышло? Потому что код выглядит вот так:

❌ Плохо (Смерть памяти):

resp, _ := http.Get(url)
// Вычитываем ВСЕ 5 Гигабайт в оперативную память
data, _ := io.ReadAll(resp.Body)
os.WriteFile("report.csv", data, 0644)

В Go есть два интерфейса, на которых держится вообще вся стандартная библиотека. Это io.Reader и io.Writer. В них всего по одному методу (Read и Write), но они превращают ваш код в систему сообщающихся сосудов.

Суть этих интерфейсов - стриминг (потоковая передача данных). Нам не нужно держать в памяти весь файл, чтобы переложить его из сети на диск или отправить другому сервису.

✅ Хорошо (Стриминг через io.Copy):

resp, _ := http.Get(url)
defer resp.Body.Close()

out, _ := os.Create("report.csv")
defer out.Close()

// Магия потока!
io.Copy(out, resp.Body)

Знаете, сколько оперативной памяти съест io.Copy при скачивании файла на 5 ГБ? Ровно 32 килобайта.
Под капотом функция создает маленький буфер, читает в него кусок данных из сети и тут же сбрасывает на диск. И так по кругу, пока поток не иссякнет.

🔥 Нюансы для Senior-ов: Композиция (Пайплайны)

Настоящая мощь io раскрывается, когда вы начинаете собирать эти интерфейсы в цепочки (паттерн Декоратор). Они вставляются друг в друга, как матрешки.

Представьте задачу: нужно скачать файл, на лету распаковать его из GZIP и посчитать SHA256-хэш, не сохраняя ничего на диск.

resp, _ := http.Get("http://example.com/data.gz")
defer resp.Body.Close()

// 1. Оборачиваем сетевой поток в GZIP-распаковщик (он тоже io.Reader!)
gzReader, _ := gzip.NewReader(resp.Body)
defer gzReader.Close()

// 2. Создаем "писателя", который считает хэш
hash := sha256.New()

// 3. io.TeeReader читает из gzReader и параллельно дублирует данные в hash
tee := io.TeeReader(gzReader, hash)

// 4. Сливаем данные в "никуда" (io.Discard),
// чтобы заставить насос качать данные по нашей трубе
io.Copy(io.Discard, tee)

fmt.Printf("Хэш файла: %x\n", hash.Sum(nil))

Мы только что обработали гигабайты сжатых данных за долю секунды, используя копейки RAM, ни разу не коснувшись жесткого диска.

Интерфейсы io - этоUnix-философия, зашитая прямо в язык. Освойте их, и вы перестанете бояться огромных объемов данных.

#golang #architecture #performance #io #bestpractices

👉 @golang_lib
Другие главы канала «Библиотека Go (Golang) разработчика»
Выберите главу, чтобы продолжить чтение
Все посты →
Глава от 30.07.2026
Как спасти сборщик мусора от перегрева: используем sync.Pool 🛟 В продолжение те…
👁 265 просмотров
Глава от 22.07.2026
Базовый стек межсервисного взаимодействия и наблюдаемости: HTTP(S), gRPC, Protob…
👁 357 просмотров
Глава от 22.07.2026
🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода Все мы любим оп…
👁 283 просмотров
Глава от 21.07.2026
🚀 Базовые паттерны проектирования в Go: Пишем чистый код Go не является классич…
👁 301 просмотров
Глава от 11.07.2026
⚙️ Go Runtime изнутри: GMP, GC, escape analysis и memory model Почему Go "прост…
👁 377 просмотров
Глава от 08.07.2026
🕳 context.Context: Хватит превращать контекст в мусорное ведро Мы передаем ctx …
👁 364 просмотров
Глава от 01.07.2026
Куда уходит память? Разбираемся с Escape-анализом в Go 🚀 Многие любят Go за вст…
👁 409 просмотров
Глава от 30.06.2026
🔀 Fan-Out / Fan-In: Строим конвейер, который не лопнет Представьте задачу: у ва…
👁 385 просмотров
Глава от 28.06.2026
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 ht…
👁 373 просмотров

Популярные посты канала «Библиотека Go (Golang) разработчика»

Хватит мучить sync.WaitGroup для HTTP-запросов Каждый джун проходит этот путь: 1. Запускаем 10 горутин через go func(). 2. Добавляем wg.Ad…
👁 857 просмотров
JSON быстрее, чем вы думаете Стандартный encoding/json в Go надежный, но... медленный. Он активно использует рефлексию, что бьет по CPU на …
👁 855 просмотров
"Семафор". Не убей базу данных Запустить 10,000 горутин в Go дешево. А вот открыть 10,000 коннектов к базе или внешнему API - дорого и боль…
👁 800 просмотров
🌪 Fuzzing: Ломаем свой код, пока это не сделали другие Мы привыкли писать Unit-тесты по принципу: "Я ожидаю, что если подать А, выйдет Б". …
👁 777 просмотров
Context Cancellation - это не kill -9 Одна из самых частых иллюзий у разработчиков, приходящих в Go: "Я вызвал cancel(), почему моя горутин…
👁 766 просмотров
🧪 Table-Driven Tests: Хватит плодить функции-клоны Проверяю PR джуниора. Файл на 500 строк, из них 450 - это тесты. Смотрю внимательнее, а …
👁 765 просмотров
Челлендж по обработке миллиарда строк на Go: от 1 минуты 45 секунд до 4 секунд Пару недель назад я прочитал о запавшем мне в душу челлендже…
👁 765 просмотров
📦 go mod: Хватит удалять go.sum, когда что-то сломалось Управление зависимостями в Go выглядит элегантно: написал import, сделал go mod tid…
👁 753 просмотров
🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода Все мы любим оптимизировать. Переписываем мапы, пулим объекты в sync.Pool, …
👁 738 просмотров
🗑 Сборщик мусора в Go: Скрытый налог на ваш CPU Если вы спросите джуна, как работает память в Go, он ответит: "Ну, там есть GC, он сам всё …
👁 715 просмотров
🧩 Struct Padding: Как вы теряете гигабайты памяти на ровном месте Знаете это чувство, когда вы долго проектируете структуру, высчитываете т…
👁 701 просмотров
🧬 Generics: Как перестать писать Java на Go Мы ждали их 10 лет. И вот, когда они появились, код-ревью превратились в выставку угловых скобо…
👁 694 просмотров
🔄 Идемпотентность: Как не списать деньги дважды при ретраях Худшее, что может сделать ваш микросервис, это упасть с пятисоткой. Нет, вру. Х…
👁 565 просмотров
📜 Паттерн Saga: Как откатить то, что откатить нельзя Представьте классическую задачу: клиент нажимает кнопку «Купить тур». Вашему бэкенду н…
👁 543 просмотров
🔌 Circuit Breaker: Как не добить лежачего (и не умереть самому) Знакомая ситуация: внешний сервис (например, процессинг платежей или тяжела…
👁 499 просмотров
Connection Pool: Как Go убивает базу данных (и как этого избежать) Выкатываете вы новый сервис, запускаете нагрузочное тестирование, и тут …
👁 480 просмотров
Куда уходит память? Разбираемся с Escape-анализом в Go 🚀 Многие любят Go за встроенный сборщик мусора (GC) и простоту работы с указателями.…
👁 409 просмотров
🔎 pprof: Как найти функцию, которая жрет 80% CPU Сервис на проде внезапно упирается в полку по процессору. Что делает новичок? Сидит и смо…
👁 387 просмотров
🔀 Fan-Out / Fan-In: Строим конвейер, который не лопнет Представьте задачу: у вас есть CSV-файл на 10 миллионов строк (или бесконечный стрим…
👁 385 просмотров
⚙️ Go Runtime изнутри: GMP, GC, escape analysis и memory model Почему Go "просто работает" быстро без ручного управления потоками — разбира…
👁 377 просмотров

Связанные темы в других каналах

Каналы из той же тематики, где часто появляются близкие сюжеты
Вся тема →
@canalmaxone
AntiCloudMod
AntiCloudMod — сообщество для тех, кто ценит свободу общения без облачной цензуры. Здесь обсуждают альтернативные мессенджеры, инструменты для приватности и децентрализов…
👥 428 744 · -2 747/7д
@BelgorodDRONE
Информация БПЛА Белгород, Белгородский район
Информация БПЛА Белгород, Белгородский район — специализированный канал в мессенджере Макс, посвященный новостям и информации о беспилотных летательных аппаратах в регион…
👥 179 672 · +4 059/7д
@WylsacomRed
Wylsacom Red
Официальный канал Wylsacom в Max. Тут всё про технологии и жизнь в ногу со временем! Номер заявления для регистрации в РКН: № 6979154178 Розыгрыши: kichaev@wylsacom.med…
👥 161 269 · +862/7д
@biologia89
РОБЛОКС🔷
РОБЛОКС В МАКС! Наш чат: https://max.ru/join/-yBHh5DSEb-WQ8DjAedoLB1fpgDOvQlWpS4PJ7Wqeb8 Реклама: https://clck.ru/3Tmmgx
👥 118 779 · +10 838/7д
@TikTokModCloud
TikTokModCloud
Официальные обновления стабильного мода TikTok Чат: https://clck.ru/3S6mVh По рекламе: https://iimax.ru/dim4ugan
👥 100 960 · +1 854/7д
@na_kruchok
ГЛЕНТ | МЕМЫ
Глент мемы Это фан-сообщество, созданное преданными поклонниками для поддержки творчества Глента. Данный канал НЕ является официальным и ведется фанатом Биржа: telega.…
👥 78 194 · +989/7д
🏷 Темы и теги
#golang #architecture #performance #io #bestpractices #go программирование #оптимизация go #паттерны проектирования #go runtime #разработка на go #Технологии
📋 О канале Библиотека Go (Golang) разработчика
Погрузись в мир Golang с библиотекой полезных материалов: от лучших практик и обзоров библиотек до советов по оптимизации и реальных кейсов. Канал для тех, кто пишет на Go и хочет расти — без воды, только то, что реально пригодится в работе.
🔍 Архив всех постов Макс
Поиск по 13,966,548 постам из 202,433 каналов
Подключить за 490 ₽/мес →
Удалить пост или канал с МАКСОТЕКИ
Заявка подтверждается через бота Макс: нужно быть администратором канала и добавить бота МАКСОТЕКИ в администраторы. После проверки канал или конкретный пост скрывается с сайта.
📊 Аналитика канала «Библиотека Go (Golang) разработчика» ➡️ Перейти в канал Макс
Заявка в МАКСОТЕКА
Добавьте свой канал в каталог
Зарегистрируйтесь в личном кабинете и добавьте канал за пару кликов.
Перейти в личный кабинет →

Бесплатная регистрация, быстрая модерация.