Выбор ответа Junior context спрашивают часто обновлено

Зачем вызывать cancel

Вопрос

Зачем писать defer cancel() после context.WithTimeout, если таймаут сработает и так?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Чтобы сразу освободить таймер и связь с родителем. Пока контекст не отменён, он держит таймер и регистрацию у родителя.

Варианты ответа

  1. Без вызова cancel таймер не начнёт отсчёт до дедлайна
  2. cancel нужен, только если таймаут больше минуты, иначе нет
  3. Без defer cancel() компилятор выдаст ошибку lostcancel
  4. Чтобы сразу освободить таймер и связь с родителемправильный ответ

Разбор

Пока контекст не отменён, он держит таймер и регистрацию у родителя. Если операция завершилась быстро, без cancel эти ресурсы живут до дедлайна, а для долгоживущего родителя это утечка. Отсчёт идёт и без cancel. Компилятор не проверяет, но go vet (lostcancel) предупреждает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.