Back to questions
Ozon Финтех
Middle+
6
Как устроено наследование контекстов в Go (context.WithValue, context.Background)?
Companies where asked
Answer from AI
sobes.tech AI
В Go пакет context реализует механизм передачи контекста выполнения (например, таймауты, отмена, значения) между горутинами. Контексты устроены в виде цепочки, где каждый новый контекст создаётся на основе родительского.
context.Background()— это корневой, пустой контекст, не имеющий родителя.context.WithValue(parent, key, val)создаёт новый контекст, который хранит пару ключ-значение и ссылается на родительский.
При запросе значения через Value(key) контекст сначала проверяет, есть ли у него это значение, если нет — делегирует запрос родителю, и так по цепочке вверх. Таким образом, значения наследуются по цепочке контекстов.
Пример:
ctx := context.Background()
ctx1 := context.WithValue(ctx, "userID", 42)
ctx2 := context.WithValue(ctx1, "requestID", "abc123")
fmt.Println(ctx2.Value("userID")) // 42
fmt.Println(ctx2.Value("requestID")) // abc123
Здесь ctx2 наследует значения из ctx1 и ctx.