Skip to content

Go 语言笔记:defer

defer 定义

deferGo 新增的关键字,表示延迟调用,在 defer 之后可以紧跟表达式或者函数。defer 后面的语句会在当前函数执行完毕后被执行。

go
func main() {
  defer fmt.Println("defer")
  ftm.Println("main")
}

// 打印结果
main
defer

defer 栈

如果某个函数中存在有多个 defer,他们之间会以入栈的方式后进先出的顺序来执行。

go
// func3 最先执行,其次是 func2,最后执行 func1
func call() {
  defer func1()
  defer func2()
  defer func3()
}

defer 和 return 执行顺序

先说结论 :return 先于 defer 执行。defer 的执行时机是在 return 执行完成之后才开始执行

go
import "fmt"

func call() int {
  defer deferCall()
  return returnCall()
}

func returnCall() int {
  fmt.Println("return called.")
  return 0
}

func deferCall() int {
  fmt.Println("defer called.")
  return 0
}

func main() {
  call()
}

// 打印结果
return called.
defer called.

Released under the MIT License.