Программа выведет NaN. Оператор return 1 устанавливает k=1, затем defer вычитает 11 из k и вычисляет квадратный корень отрицательного числа.
Понимание порядка выполнения отложенных вызовов
Программа выведет NaN. Оператор return 1 устанавливает k=1, затем defer вычитает 11 из k и вычисляет квадратный корень отрицательного числа.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно определить, какой результат выведет программа. Разберитесь, как работают defer‑выражения в Go и влияет ли их порядок на возвращаемое значение функции.
package main
import (
"fmt"
"math"
)
func foo() (k float64) {
i := 36.0
defer func() { k = math.Sqrt(k) }()
defer func() { k -= 11 }()
defer func() { i += 10 }()
return 1
}
func main() {
fmt.Println(foo())
}
Ответ
Программа выведет NaN. Оператор return 1 устанавливает k=1, затем defer вычитает 11 из k и вычисляет квадратный корень отрицательного числа.
Последний зарегистрированный defer сначала увеличивает i, но i не является возвращаемым значением и больше не используется. Следующий превращает k в -10, первый вызывает math.Sqrt(-10), что даёт NaN без panic. Отложенные функции выполняются в порядке LIFO после присваивания именованному результату.