Возврат значения при использовании defer с именованным результатом

Сама test1 возвращает 1: именованный out сначала равен нулю, а defer увеличивает его перед выходом. Но весь пример не скомпилируется, если test3 нигде не определена.

Короткий ответ

Что ответить на собеседовании

Сама test1 возвращает 1: именованный out сначала равен нулю, а defer увеличивает его перед выходом. Но весь пример не скомпилируется, если test3 нигде не определена.

Подробный разбор

Ответ с пояснениями

Условие

Нужно определить, какое значение будет возвращено функцией test1, учитывая порядок выполнения отложенной функции и изменение переменной‑результата.

func main() {
  fmt.Println(test1())
  test3()
}

func test1() (out int) {
  defer func() {
    out++
  }()
  return
}

Ответ

Сама test1 возвращает 1: именованный out сначала равен нулю, а defer увеличивает его перед выходом. Но весь пример не скомпилируется, если test3 нигде не определена.

Пустой return возвращает текущее значение именованного результата после выполнения отложенных функций. Замыкание обращается именно к out и изменяет возвращаемое значение. Для проверки показанной логики удалите посторонний вызов test3 либо предоставьте его определение; предполагать поведение отсутствующей функции нельзя.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее