Выбор ответа Junior context спрашивают часто обновлено
Зачем вызывать cancel
Вопрос
Зачем писать defer cancel() после context.WithTimeout, если таймаут сработает и так?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Чтобы сразу освободить таймер и связь с родителем. Пока контекст не отменён, он держит таймер и регистрацию у родителя.
Варианты ответа
- Без вызова cancel таймер не начнёт отсчёт до дедлайна
- cancel нужен, только если таймаут больше минуты, иначе нет
- Без defer cancel() компилятор выдаст ошибку lostcancel
- Чтобы сразу освободить таймер и связь с родителемправильный ответ
Разбор
Пока контекст не отменён, он держит таймер и регистрацию у родителя. Если операция завершилась быстро, без cancel эти ресурсы живут до дедлайна, а для долгоживущего родителя это утечка. Отсчёт идёт и без cancel. Компилятор не проверяет, но go vet (lostcancel) предупреждает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.