Все вопросы

16 Функции

Что делает defer и в каком порядке он выполняется?

defer откладывает вызов до выхода из функции: обычный return, паника — неважно. Несколько defer выполняются в обратном порядке, как стек. Аргументы отложенного вызова вычисляются сразу, в момент defer, а не в момент выхода.

Поэтому defer f.Close() и defer mu.Unlock() ставят сразу после успешного захвата ресурса. В примере i уже скопирован в аргумент Println и равен нулю, хотя к концу функции он стал единицей.

Пример

Go

порядок LIFO и ранние аргументы

package main

import "fmt"

func main() {
    defer fmt.Println("первый defer, выйдет последним")
    defer fmt.Println("второй defer")

    i := 0
    defer fmt.Println("значение i на момент defer:", i)
    i++
    fmt.Println("тело функции, i =", i)
}