← ко всем постам
2026-08-19 · #concurrency

context.Context: правильная отмена операций

Пакет context появился, чтобы решить одну задачу: как аккуратно отменить дерево операций, когда результат уже не нужен — например, клиент закрыл соединение.

func fetch(ctx context.Context, url string) error {
    req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
    _, err := http.DefaultClient.Do(req)
    return err
}

Главное правило

Context передаётся первым аргументом функции и никогда не хранится в структуре. Это соглашение, но нарушать его не стоит — весь стандартный пакет построен вокруг него.

Не забывайте вызывать cancel() через defer, иначе получите утечку — тот самый случай, о котором писал в прошлом посте про горутины.