Загрузка…
Загрузка…
Go · junior · сложность 3
context.Context в Go — стандартный механизм управления жизненным циклом запроса/операции: отмены, сроки, таймауты и метаданные запроса. Это позволяет всем ветвям исполнения видеть один сигнал «стоп».
Context:Отмена: прекратить работу, которая больше не нужна (клиент имеет отключено, в соседнем филиале произошла ошибка, услуга не работает прекращение).
Срок/тайм-аут: ограничивает время выполнения операций (HTTP, БД, внешние API), чтобы не зависать бесконечно.
Значения в области запроса: данные запроса на передачу услуги (trace-id, токен аутентификации, идентификатор арендатора) между уровнями.
ctx передается в качестве первого параметра функции, которая может блокировать или выполнять
I/O.
Каждый дочерний вызов получает один и тот же ctx или производную:
⟦С0⟧
⟦С0⟧
⟦С0⟧
⟦С0⟧
отмена родительского контекста отменяет всех дочерних контекстов;
сроки наследуются (или сужаются).
Не храните Context в структуре как долгоживущее поле.
Не передавайте контекст nil (используйте context.Background() или context.TODO()).
Не используйте WithValue для бизнес-параметров, которые должны быть явной функцией.
arguments.
context.Context — это запрос «нервная система» в Go. Он распределяет контроль времени и отмены по всему дереву вызовов, делая конкурирующий код управляемым, экономичным и предсказуемым в производственной среде.
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
if err := service.Do(ctx); err != nil {
http.Error(w, err.Error(), 500)
}
}
func (s *Service) Do(ctx context.Context) error {
ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
defer cancel()
return s.repo.Call(ctx)
}context.Context в Go — стандартный механизм управления жизненным циклом запроса/операции: отмены, сроки, таймауты и метаданные запроса.