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 передаётся первым аргументом функции и никогда не хранится в структуре. Это соглашение, но нарушать его не стоит — весь стандартный пакет построен вокруг него.
context.Background()— корневой, для main и тестов.context.WithTimeout— автоматическая отмена по времени.context.WithCancel— ручная отмена через возвращённую функцию.
Не забывайте вызывать cancel() через defer, иначе получите утечку — тот самый случай, о котором писал в прошлом посте про горутины.