在go语言中,程序员创建的资源如文件句柄、数据库连接、锁等,需要在函数执行完毕后释放,因此go提供了defer的机制,在函数退出时去释放defer指定的资源,这样我们在一些资源申请的时候,可以先defer 声明释放语句,无需担心后续忘记释放资源。defer利用了栈,先声明的defer后执行。
我们来看一个简单的例子:
package main
import (
"fmt"
)
func sum(n1 int, n2 int) int {
defer fmt.Println("n1:", n1)
defer fmt.Println("n2:", n2)
n3 := n1 + n2
fmt.Println("n3:", n3
return n3
}
func main() {
res := sum(10, 20)
fmt.Println("res:", res)
}
上面的输出会先输出n3,然后在函数退出时执行defer的栈内容,先输出n2,再输出n1,最后输出res
需要注意的是,defer在将语句入栈的时候,会将相关的值拷贝同时入栈,这意味着我们defer之后对变量的变更不会影响入栈时的值