Понимание порядка выполнения отложенных вызовов

Программа выведет 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 после присваивания именованному результату.

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

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

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

Подробнее