По порядку Middle Ошибки, defer, panic и recover обновлено

Что происходит при return с defer

Вопрос

Функция func f() (n int) содержит defer и выполняет return 5. Расставьте шаги в порядке выполнения.

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

Расставьте шаги по порядку стрелками.

  1. 1
    Значение присваивается именованному результату n
  2. 2
    Выполняются отложенные функции в обратном порядке
  3. 3
    Функция возвращает текущее значение n вызывающему
  4. 4
    Вычисляется выражение после return (5)
Показать ответ и разбор

Коротко

return с выражением не атомарен: сначала результат записывается, потом работают defer (и могут его изменить), и только затем управление возвращается. Поэтому defer умеет менять именованные результаты.

Правильный порядок

  1. 1
    Вычисляется выражение после return (5)
  2. 2
    Значение присваивается именованному результату n
  3. 3
    Выполняются отложенные функции в обратном порядке
  4. 4
    Функция возвращает текущее значение n вызывающему

Разбор

return с выражением не атомарен: сначала результат записывается, потом работают defer (и могут его изменить), и только затем управление возвращается. Поэтому defer умеет менять именованные результаты.

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

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

Термины по теме