HomeToolsAbout

Defer

What is it

Schedules function calls to execute BEFORE the surrounding function returns.

  • commonly used for cleanup tasks like closing files or releasing resources.

Without returns, defer executes after a non-defer execution.

func main() { defer fmt.Println("world") fmt.Println("hello") } /* hello world */

In below example, the defer function increments the return value i BEFORE the surrounding function returns.

  • A return statement that specifies results sets the result parameters before any deferred functions are executed.
  • deferred functions are invoked immediately before the surrounding function returns

Meaning, the return parameter i has already been set to return value 1 immediate as the function starts executing.

  • Then, the defer functions begin execution.
  • Then, the return parameter i is set again to 2 since i++ is executed via the defer func().
  • Since there is only one i, i is no longer 1, it is a 2.
func main() { c() } func c() (i int) { defer func() { i++ print(i) }() defer func() { print("third") }() defer func() { print("second") }() defer func() { print("first") }() print(i) return 1 } /* // i is initialized to a default int value of 0 0 // print(i) prints initial value // i is then set to return value 1, but function does not return yet first // Since defer is LIFO, last defer function is first to execute second third 2 // i++ print(i) // last element in stack // since return value is i, not what follows after "return", printing c() would result in 2 */
AboutContact