Ответ
Контексты в Go (context.Context) — это механизм для управления временем жизни операций, передачи данных и отмены. Основные сценарии:
- Отмена операций (deadlines/timeouts):
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
// Передаем контекст в вызов
resp, err := http.NewRequestWithContext(ctx, "GET", url, nil)
-
Передача данных (через
context.WithValue), но осторожно — только для request-scoped данных. -
Работа с горутинами — контекст помогает корректно останавливать дочерние горутины.
Важные нюансы:
- Всегда вызывайте
defer cancel()для контекстов с отменой - Контекст immutable — каждый
WithCancel/WithValueсоздает новый - Не храните структуры в контексте — только интерфейсы
- HTTP-обработчики получают контекст из запроса
Пример цепочки контекстов:
ctx := context.Background()
ctx = context.WithValue(ctx, "requestID", "123")
ctx, cancel := context.WithTimeout(ctx, time.Second)