Сама test1 возвращает 1: именованный out сначала равен нулю, а defer увеличивает его перед выходом. Но весь пример не скомпилируется, если test3 нигде не определена.
Возврат значения при использовании defer с именованным результатом
Сама 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 либо предоставьте его определение; предполагать поведение отсутствующей функции нельзя.