Библиотека Go (Golang) разработчика
Библиотека Go (Golang) разработчика
1 972 подписчиков · @golang_lib
К каналу →
🔀 Fan-Out / Fan-In: Строим конвейер, который не лопнет Представьте задачу: у вас есть CSV-файл на 10 миллионов строк (или бесконечный стрим из Kafka). Каждую строку нужно прочитат…
Читать далее →
381
Реклама
Куда уходит память? Разбираемся с Escape-анализом в Go 🚀 Многие любят Go за встроенный сборщик мусора (GC) и простоту работы с указателями. Но чтобы писать по-настоящему быстрый к…
Читать далее →
404

🕳 context.

🕳 context.Context: Хватит превращать контекст в мусорное ведро

Мы передаем ctx context.Context первым аргументом почти в каждую функцию. Это кровеносная система Go-приложений, которая отлично справляется с отменой операций и таймаутами.

Но есть в интерфейсе контекста один метод, который открывает портал в ад - это Value().

Часто разработчики (особенно выходцы из языков с thread-local storage) смотрят на ctx.Value и думают: "О, отличная глобальная мапа! Положу-ка я сюда инстанс базы данных, логгер и данные пользователя, чтобы не прокидывать их через аргументы 10 функций".

Давайте разберем, почему это архитектурное преступление.

❌ Проблема 1: Убийство статической типизации

Сила Go - в строгой типизации на этапе компиляции. Когда вы кладете что-то в контекст, оно превращается в any (или interface{}).

// Где-то в мидлваре
ctx = context.WithValue(ctx, "db", dbConnection)

// Где-то в репозитории
db := ctx.Value("db").(*sql.DB) // Молимся, чтобы там не было nil

Ваша функция теперь имеет скрытую зависимость. Глядя на сигнатуру func GetUser(ctx context.Context), невозможно понять, что для ее работы нужен коннект к БД. Узнаете вы об этом только в рантайме, когда словите panic: interface conversion.

❌ Проблема 2: Медленный поиск (O(N))

Контекст - это не map (хэш-таблица). Под капотом WithValue каждый раз создает новый узел, который ссылается на родительский контекст. Образуется связный список (дерево).

Когда вы вызываете ctx.Value("key"), Go берет текущий узел и проверяет ключ. Если не нашел — идет к родителю. И так до самого верха. Если ваш ключ лежит в самом начале цепочки из 20 мидлварей, поиск будет прочесывать память каждый раз, убивая кэш процессора.



Как использовать ctx.Value правильно?

Официальная документация гласит: "Используйте значения контекста только для данных, привязанных к области видимости запроса (request-scoped data)".

✅ Идеальные кандидаты для ctx.Value:

• TraceID / RequestID (для распределенного трейсинга).
• IP-адрес клиента.
• ID авторизованного пользователя (но не вся структура User с бизнес-логикой).

То есть данные, которые нужны инфраструктуре (логгеру, метрикам), но никак не влияют на бизнес-логику функции.

🔥 Защита от коллизий ключей
Никогда не используйте встроенные типы (например, string) в качестве ключей для WithValue. Если два разных пакета используют ключ "id", они перезапишут данные друг друга.

Всегда создавайте неэкспортируемый кастомный тип:

type contextKey string
const userIDKey contextKey = "user_id"

// Обертка для записи
func WithUserID(ctx context.Context, id int) context.Context {
return context.WithValue(ctx, userIDKey, id)
}

// Обертка для чтения (безопасная, возвращает (int, bool))
func UserIDFromContext(ctx context.Context) (int, bool) {
id, ok := ctx.Value(userIDKey).(int)
return id, ok
}

Про context.TODO():
Если вы пишете код и не знаете, откуда взять контекст (например, рефакторите старый легаси) - используйте context.TODO(). Технически это тот же context.Background(), но семантически это маячок для линтеров и коллег: "Я оставил здесь технический долг, позже нужно прокинуть нормальный контекст".


#golang #architecture #context #bestpractices #cleancode

👉 @golang_lib
⚙️ Go Runtime изнутри: GMP, GC, escape analysis и memory model Почему Go "просто работает" быстро без ручного управления потоками — разбираем механику под капотом. 1. GMP-модель …
Читать далее →
366
🚀 Базовые паттерны проектирования в Go: Пишем чистый код Go не является классическим объектно-ориентированным языком. Здесь нет классов и наследования в привычном понимании, поэто…
Читать далее →
287
Другие главы канала «Библиотека Go (Golang) разработчика»
Выберите главу, чтобы продолжить чтение
Все посты →
Глава от 30.07.2026
Как спасти сборщик мусора от перегрева: используем sync.Pool 🛟 В продолжение те…
👁 216 просмотров
Глава от 22.07.2026
Базовый стек межсервисного взаимодействия и наблюдаемости: HTTP(S), gRPC, Protob…
👁 335 просмотров
Глава от 22.07.2026
🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода Все мы любим оп…
👁 263 просмотров
Глава от 21.07.2026
🚀 Базовые паттерны проектирования в Go: Пишем чистый код Go не является классич…
👁 287 просмотров
Глава от 11.07.2026
⚙️ Go Runtime изнутри: GMP, GC, escape analysis и memory model Почему Go "прост…
👁 366 просмотров
Глава от 01.07.2026
Куда уходит память? Разбираемся с Escape-анализом в Go 🚀 Многие любят Go за вст…
👁 404 просмотров
Глава от 30.06.2026
🔀 Fan-Out / Fan-In: Строим конвейер, который не лопнет Представьте задачу: у ва…
👁 381 просмотров
Глава от 28.06.2026
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 ht…
👁 367 просмотров
Глава от 28.06.2026
Что изменилось в защите ПДн и как избежать штрафов? Рассказываем в канале КСБ-СО…
👁 119 просмотров

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

Хватит мучить sync.WaitGroup для HTTP-запросов Каждый джун проходит этот путь: 1. Запускаем 10 горутин через go func(). 2. Добавляем wg.Ad…
👁 854 просмотров
JSON быстрее, чем вы думаете Стандартный encoding/json в Go надежный, но... медленный. Он активно использует рефлексию, что бьет по CPU на …
👁 851 просмотров
"Семафор". Не убей базу данных Запустить 10,000 горутин в Go дешево. А вот открыть 10,000 коннектов к базе или внешнему API - дорого и боль…
👁 797 просмотров
🌪 Fuzzing: Ломаем свой код, пока это не сделали другие Мы привыкли писать Unit-тесты по принципу: "Я ожидаю, что если подать А, выйдет Б". …
👁 774 просмотров
Челлендж по обработке миллиарда строк на Go: от 1 минуты 45 секунд до 4 секунд Пару недель назад я прочитал о запавшем мне в душу челлендже…
👁 763 просмотров
Context Cancellation - это не kill -9 Одна из самых частых иллюзий у разработчиков, приходящих в Go: "Я вызвал cancel(), почему моя горутин…
👁 763 просмотров
🧪 Table-Driven Tests: Хватит плодить функции-клоны Проверяю PR джуниора. Файл на 500 строк, из них 450 - это тесты. Смотрю внимательнее, а …
👁 762 просмотров
📦 go mod: Хватит удалять go.sum, когда что-то сломалось Управление зависимостями в Go выглядит элегантно: написал import, сделал go mod tid…
👁 750 просмотров
🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода Все мы любим оптимизировать. Переписываем мапы, пулим объекты в sync.Pool, …
👁 735 просмотров
🗑 Сборщик мусора в Go: Скрытый налог на ваш CPU Если вы спросите джуна, как работает память в Go, он ответит: "Ну, там есть GC, он сам всё …
👁 712 просмотров
🧩 Struct Padding: Как вы теряете гигабайты памяти на ровном месте Знаете это чувство, когда вы долго проектируете структуру, высчитываете т…
👁 698 просмотров
🧬 Generics: Как перестать писать Java на Go Мы ждали их 10 лет. И вот, когда они появились, код-ревью превратились в выставку угловых скобо…
👁 691 просмотров
🔄 Идемпотентность: Как не списать деньги дважды при ретраях Худшее, что может сделать ваш микросервис, это упасть с пятисоткой. Нет, вру. Х…
👁 561 просмотров
📜 Паттерн Saga: Как откатить то, что откатить нельзя Представьте классическую задачу: клиент нажимает кнопку «Купить тур». Вашему бэкенду н…
👁 539 просмотров
🔌 Circuit Breaker: Как не добить лежачего (и не умереть самому) Знакомая ситуация: внешний сервис (например, процессинг платежей или тяжела…
👁 496 просмотров
Connection Pool: Как Go убивает базу данных (и как этого избежать) Выкатываете вы новый сервис, запускаете нагрузочное тестирование, и тут …
👁 477 просмотров
Куда уходит память? Разбираемся с Escape-анализом в Go 🚀 Многие любят Go за встроенный сборщик мусора (GC) и простоту работы с указателями.…
👁 404 просмотров
🔎 pprof: Как найти функцию, которая жрет 80% CPU Сервис на проде внезапно упирается в полку по процессору. Что делает новичок? Сидит и смо…
👁 382 просмотров
🔀 Fan-Out / Fan-In: Строим конвейер, который не лопнет Представьте задачу: у вас есть CSV-файл на 10 миллионов строк (или бесконечный стрим…
👁 381 просмотров
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 367 просмотров

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

Каналы из той же тематики, где часто появляются близкие сюжеты
Вся тема →
@canalmaxone
AntiCloudMod
AntiCloudMod — сообщество для тех, кто ценит свободу общения без облачной цензуры. Здесь обсуждают альтернативные мессенджеры, инструменты для приватности и децентрализов…
👥 431 472 · -3 061/7д
@BelgorodDRONE
Информация БПЛА Белгород, Белгородский район
Информация БПЛА Белгород, Белгородский район — специализированный канал в мессенджере Макс, посвященный новостям и информации о беспилотных летательных аппаратах в регион…
👥 177 763 · +8 757/7д
@WylsacomRed
Wylsacom Red
Официальный канал Wylsacom в Max. Тут всё про технологии и жизнь в ногу со временем! Номер заявления для регистрации в РКН: № 6979154178 Розыгрыши: kichaev@wylsacom.med…
👥 160 627 · +605/7д
@biologia89
РОБЛОКС🔷
РОБЛОКС В МАКС! Реклама: https://clck.ru/3Tmmgx
👥 116 348 · +16 790/7д
@TikTokModCloud
TikTokModCloud
Официальные обновления стабильного мода TikTok Чат: https://clck.ru/3S6mVh По рекламе: https://iimax.ru/dim4ugan
👥 100 141 · +1 708/7д
@na_kruchok
ГЛЕНТ | МЕМЫ
Глент мемы Это фан-сообщество, созданное преданными поклонниками для поддержки творчества Глента. Данный канал НЕ является официальным и ведется фанатом Биржа: telega.…
👥 77 679 · +1 101/7д
🏷 Темы и теги
#golang #architecture #context #bestpractices #cleancode #go программирование #оптимизация go #паттерны проектирования #go runtime #разработка на go #Технологии
📋 О канале Библиотека Go (Golang) разработчика
Погрузись в мир Golang с библиотекой полезных материалов: от лучших практик и обзоров библиотек до советов по оптимизации и реальных кейсов. Канал для тех, кто пишет на Go и хочет расти — без воды, только то, что реально пригодится в работе.
🔍 Архив всех постов Макс
Поиск по 13,689,732 постам из 202,319 каналов
Подключить за 490 ₽/мес →
Удалить пост или канал с МАКСОТЕКИ
Заявка подтверждается через бота Макс: нужно быть администратором канала и добавить бота МАКСОТЕКИ в администраторы. После проверки канал или конкретный пост скрывается с сайта.
📊 Аналитика канала «Библиотека Go (Golang) разработчика» ➡️ Перейти в канал Макс
Заявка в МАКСОТЕКА
Добавьте свой канал в каталог
Зарегистрируйтесь в личном кабинете и добавьте канал за пару кликов.
Перейти в личный кабинет →

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