跳到主要内容

go defer语句使用

1. 定义

defer语句能够延迟执行某个函数(deferred function),直到使用defer语句的函数返回前。例如:

package main

import "fmt"

func power(i int) int {
fmt.Printf("\n i is %d and result is %d ", i, i*i)
return i * i
}

func main() {
i := 0

for ; i < 5; i++ {
defer power(i)
}
i += 5
power(i)

}

 从上面执行的结果可以得出几个结论:

  1. 最后一个power函数执行完成后,main函数返回前,开始执行for循环里的 deferred function

  2. deferred function 的参数是在执行defer语句时计算的,不是在调用 deferred function 时计算的(执行defer语句时i0,1,2,3,4,调用 deferred functioni 为10)。

  3. 多个 deferred function 执行时遵守 LIFO (后进先出)原则。

 下面例子更清晰的说明 deferred function 的参数是在执行defer语句的时候计算的。

package main

import "fmt"

func trace(s string) string {
fmt.Println("entering:", s)
return s
}

func un(s string) {
fmt.Println("leaving:", s)
}

func a() {
defer un(trace("a"))
fmt.Println("in a")
}

func b() {
defer un(trace("b"))
fmt.Println("in b")
a()
}

func main() {
b()
}

defer能够保证函数执行完之前调用 deferred function(例如关闭文件),防止执行分支过多之后出现遗漏。但同时执行的流程发生了变化(例如关闭文件在函数开始的地方),对可读性造成了一定的影响。

2. panic defer recover

defer关键字主要的使用场景是异常恢复,panic defer recover模式参考异常处理


  1. Defer Keyword in Golang
  2. Effective Go

署名-非商业性使用-禁止演绎 4.0 国际