作用
延迟执行语句
在函数其他语句执行完时,才会开始运行defer语句。
不管函数是正常执行完,或者遇到return,还是发生panic错误,只要defer在发生之前,都会执行。
用法
只能在函数内使用。
defer 后面跟上 语句
func deferTest() {
f, err := os.Open("filename")
if err != nil {
fmt.Println("文件打开错误")
return
}
//如果文件打开成功,运行到这里,等函数运行结果,会自动执行close()
defer f.Close()
//....其他文件操作
fmt.Println(f.Name())
}
执行顺序
defer的执行顺序可以看做一个栈,先添加的defer的在栈底,最后添加defer的在栈顶。
示例:
func deferTest() {
fmt.Println("开始执行函数。。。。")
defer fmt.Println("函数已执行完毕,开始执行defer,这是第1个defer")
defer fmt.Println("函数已执行完毕,开始执行defer,这是第2个defer")
defer fmt.Println("函数已执行完毕,开始执行defer,这是第3个defer")
fmt.Println("函数执行完毕。。。。")
}
运行结果:
开始执行函数。。。。
函数执行完毕。。。。
函数已执行完毕,开始执行defer,这是第3个defer
函数已执行完毕,开始执行defer,这是第2个defer
函数已执行完毕,开始执行defer,这是第1个defer
从结果可以看到,最后的defer最先执行,第一个defer最后执行。
使用场景
常用来函数执行完时,释放资源。
比如打开文件后关闭文件,使用并发时加锁后解锁。