Три ошибки с context, которые я делал

24 августа 2026

1. Контекст в поле структуры

Контекст описывает время жизни запроса, а не объекта. Сохранив его в структуре, легко получить клиента, который внезапно отменяет все вызовы, потому что исходный запрос давно завершился. Контекст передаётся первым аргументом, и точка.

2. Забытый cancel()

ctx, cancel := context.WithTimeout(parent, time.Second)
defer cancel() // без этого таймер живёт до срабатывания

go vet об этом предупреждает, но только если cancel не используется вообще. Если он ушёл в другую функцию и там потерялся, vet промолчит.

3. Таймаут, который ничего не ограничивает

Если внутри вызывается код, который контекст не принимает (старый драйвер, time.Sleep, чтение из канала без select), таймаут просто не сработает. Контекст — это сигнал, а не принуждение: его нужно слушать.