Какой опыт работы с контекстами

«Какой опыт работы с контекстами» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Контексты в Go (context.Context) — это механизм для управления временем жизни операций, передачи данных и отмены. Основные сценарии:

  1. Отмена операций (deadlines/timeouts):
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

// Передаем контекст в вызов
resp, err := http.NewRequestWithContext(ctx, "GET", url, nil)
  1. Передача данных (через context.WithValue), но осторожно — только для request-scoped данных.

  2. Работа с горутинами — контекст помогает корректно останавливать дочерние горутины.

Важные нюансы:

  • Всегда вызывайте defer cancel() для контекстов с отменой
  • Контекст immutable — каждый WithCancel/WithValue создает новый
  • Не храните структуры в контексте — только интерфейсы
  • HTTP-обработчики получают контекст из запроса

Пример цепочки контекстов:

ctx := context.Background()
ctx = context.WithValue(ctx, "requestID", "123")
ctx, cancel := context.WithTimeout(ctx, time.Second)