Sobes.tech
Назад к вопросам
Middle+
5

Как устроено наследование контекстов в Go (context.WithValue, context.Background)?

Компании, где спрашивали
Ozon ФинтехOzon Финтех

Ответ от нейросети

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.