Что произойдёт, если defer стоит снаружи горутины, а не внутри неё?

Если defer стоит снаружи горутины, то отложенная функция будет вызвана при выходе из внешней функции, а не при завершении горутины.

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

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

Если defer стоит снаружи горутины, то отложенная функция будет вызвана при выходе из внешней функции, а не при завершении горутины. Это значит, что ресурсы, которые вы хотели освободить внутри горутины, могут остаться занятыми до тех пор, пока внешняя функция не завершится.

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

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

Условие

Что произойдёт, если defer стоит снаружи горутины, а не внутри неё?

Ответ

Если defer стоит снаружи горутины, то отложенная функция будет вызвана при выходе из внешней функции, а не при завершении горутины. Это значит, что ресурсы, которые вы хотели освободить внутри горутины, могут остаться занятыми до тех пор, пока внешняя функция не завершится.

Например:

func main() {
    defer fmt.Println("defer в main")

    go func() {
        defer fmt.Println("defer в горутине")
        fmt.Println("внутри горутины")
    }()

    time.Sleep(time.Second)
}

Если defer внутри горутины, он выполнится при завершении горутины. Если же defer объявлен снаружи, он выполнится при выходе из main, независимо от горутины.

Таким образом, defer должен быть внутри горутины, если вы хотите гарантировать освобождение ресурсов именно при завершении этой горутины.

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

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

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

Подробнее