TGViewer
Библиотека Go-разработчика | Golang Библиотека Go-разработчика | Golang @goproglib · 24.1K subscribers
Post #7486 2.84K
👎 Почему context.Value портит код

Идея положить данные в контекст и достать их через пару вызовов глубже звучит привлекательно. Код чище, сигнатуры функций не разрастаются, промежуточные уровни не знают о деталях.

Но именно в этом и проблема context.Value превращается в чёрный ящик, ломает типобезопасность и делает важные зависимости невидимыми.

Паттерн «A положил payment в контекст, C его вытащил, а B просто прокинул ctx дальше» выглядит аккуратно, пока вы помните все неочевидные места чтения. Через неделю уже не видно, какие функции реально зависят от payment а это критические бизнес данные, спрятанные в контейнер без гарантий на уровне компилятора.

Любая ошибка в ключе, типе или месте, где забыли вызвать WithValue, всплывает только в рантайме, иногда в виде тихих багов, а не паники.

Как обычно делают с context.Value:


type Payment struct {
ID string
Amount int
}

func A(ctx context.Context, transactionID string) {
payment := dbGetPayment(ctx, transactionID)

// Кладём бизнес данные в контекст
ctx = context.WithValue(ctx, "payment", payment)

B(ctx)
}

func B(ctx context.Context) {
// Эта функция формально не знает про payment,
// но обязана протащить ctx дальше
doSomething(ctx)
C(ctx)
}

func C(ctx context.Context) {
// Где то глубоко в стеке достаем payment из «чёрного ящика»
payment, ok := ctx.Value("payment").(Payment)
if !ok {
log.Println("payment not found in context")
return
}

processPayment(payment)
}


context.Value стоит оставлять для узкого набора метаданных, а важные доменные данные лучше передавать явно через параметры.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoDeep
  • 👍 5
  • ❤ 3
  • 🌚 2
  • 🤔 1
  • 👾 1
More from @goproglib
  1. Sep 20, 2026🤔 Вопрос с собеседования по Go Что выведет программа? ❤️ — [1 2 3 4 5] / [1 2 10] 🔥 — [1…
  2. Sep 19, 2026🛠 Rune — open-source IDE и terminal multiplexer на Go Rune объединяет IDE, терминал и AI-…
  3. Sep 18, 2026🤩 SQLite вместо отдельного брокера в Go Watermill поддерживает SQLite Pub/Sub — сообщения…
  4. Sep 17, 2026⚡️ Go 1.27 ускоряет небольшие аллокации В Go 1.27 появился size-specialized memory allocat…
  5. Sep 16, 2026🛠 Напишите конфиг сами viper — самая частая рекомендация для конфигурации в Go. Он умеет…
  6. Sep 15, 2026🔥 Шейдеры на Go: как оживить игру с помощью кода В Ebitengine шейдеры пишутся на Kage — я…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →