16 Функции
Что делает defer и в каком порядке он выполняется?
Ответ
defer откладывает вызов до выхода из функции: обычный return, паника — неважно. Несколько defer выполняются в обратном порядке, как стек. Аргументы отложенного вызова вычисляются сразу, в момент defer, а не в момент выхода.
Подробнее
Поэтому defer f.Close() и defer mu.Unlock() ставят сразу после успешного захвата ресурса. В примере i уже скопирован в аргумент Println и равен нулю, хотя к концу функции он стал единицей.
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)
}