Что такое defer? Что выведет следующий код?

В Go ключевое слово defer откладывает выполнение функции до момента выхода из окружающей функции. Все отложенные вызовы выполняются в обратном порядке (LIFO).

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

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

В Go ключевое слово defer откладывает выполнение функции до момента выхода из окружающей функции. Все отложенные вызовы выполняются в обратном порядке (LIFO).

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

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

Условие

Что такое defer? Что выведет следующий код?

type X struct {
    V int
}

func (x X) S() {
    fmt.Println(x.V)
}

func main() {
    x := X{123}
    defer x.S()
    x.V = 456
}

Ответ

В Go ключевое слово defer откладывает выполнение функции до момента выхода из окружающей функции. Все отложенные вызовы выполняются в обратном порядке (LIFO).

Пример:

package main
import "fmt"

func main() {
    defer fmt.Println(3)
    defer fmt.Println(2)
    defer fmt.Println(1)
}

Этот код выведет:

1
2
3

Потому что вызовы defer выполняются в обратном порядке их объявления.

Чтобы вывести 4,5,6 вместо 1,2,3, нужно изменить порядок вызовов defer или отказаться от них и вызвать функции напрямую:

package main
import "fmt"

func main() {
    fmt.Println(4)
    fmt.Println(5)
    fmt.Println(6)
}

Или, если нужно использовать defer, то объявлять их в обратном порядке:

package main
import "fmt"

func main() {
    defer fmt.Println(4)
    defer fmt.Println(5)
    defer fmt.Println(6)
}

Этот код выведет:

6
5
4

Чтобы получить именно 4,5,6 с defer, нужно использовать дополнительные функции или не использовать defer для этого вывода.

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

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

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

Подробнее