A defer statement pushes a function call onto a list. The list of saved calls is executed after the surrounding function returns. — The Go Blog: Defer, Panic, and Recover
Another way to understand the above statement:
A defer statements pushes a function call onto a stack. The stack of saved calls popped out (LIFO) and deferred functions are invoked immediately before the surrounding function returns.
func c() (i int) {
defer func() { i++ }()
return 1
}
After 1 is returned, the defer func() { i++ }() gets executed. Hence, in order of executions:
- i = 1 (return 1)
- i++ (defer func pop out from stack and executed)
- i == 2 (final result of named variable i)
For understanding sake:
func c() (i int) {
defer func() { fmt.Println("third") }()
defer func() { fmt.Println("second") }()
defer func() { fmt.Println("first") }()
return 1
}
Order of executions:
- i = 1 (return 1)
- “first”
- “second”
- “third”