Контекст в Go используется для управления жизненным циклом запросов и контроля выполнения горутин. Основные случаи применения:
- Отмена: Позволяет отменить выполнение цепочки горутин, связанной с определенным запросом. Например, при закрытии соединения или по таймауту.
- Таймаут: Устанавливает крайний срок выполнения операции. Если операция не завершается в срок, контекст отменяется. Это предотвращает бесконечное ожидание.
- Передача запросо-специфичных данных: Позволяет передавать данные, относящиеся к конкретному запросу (например, ID пользователя, идентификатор трассировки), через цепочку вызовов функций без изменения их сигнатур.
Примеры использования:
-
Отмена по сигналу:
go
-
Таймаут:
go
-
Передача данных:
go
Важно использовать context.Background() или context.TODO() в качестве корневого контекста и передавать его вниз по цепочке вызовов. Не следует хранить контекст в структурах данных, если он не связан напрямую с жизненным циклом этой структуры.