defer 简介
defer 通俗来讲就是延迟调用。defer 会在当前函数返回之前执行 defer 注册的函数。
例如: defer func_x()
这样语句会让你注册一个函数变量到 defer 的全局链表中,在 defer 语句所在的函数退出之前调用。
主要使用场景
panic 场景
:这个是重要的一个特性,通常能简化我们的代码,确保无论任何场景,defer 的函数一定调用,通常用在锁或者资源的释放场景较多;配套的两个行为代码可以放在最近的位置
:创建&释放、加锁&放锁、前置&后置,使得代码更易读,编程体验优秀。最近的地方是哪里?下一行
延迟调用
package main
func main() {
defer println("--- defer ---")
println("--- end ---")
}
defer 会在main函数之前调用。
核心要点:
延迟调用
:defer 语句本身虽然是 main 的第一行,但是 fmt.Println 是先打印的;defer 关键字一定是处于函数上下文
:defer 必须放在函数内部
输出结果:
LIFO
一个函数内有多个defer时,压栈式执行,后入先出。
package main
import "fmt"
func main() {
defer func() {
fmt.Println("1")
}()
defer func() {
fmt.Println("2")
}()
}
异常场景
注意:一定要先注册defer,放在函数第一行,放到如下代码return之前,是无法捕获异常的;
package main
import "fmt"
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println("捕获panic", err)
}
}()
var sliceOne []int
sliceOne[0] = 1
return
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。