defer 简介
defer 艰深来讲就是提早调用。defer 会在以后函数返回之前执行 defer 注册的函数。
例如: defer func_x()
这样语句会让你注册一个函数变量到 defer 的全局链表中,在 defer 语句所在的函数退出之前调用。
次要应用场景
panic 场景
:这个是重要的一个个性,通常能简化咱们的代码,确保无论任何场景,defer 的函数肯定调用,通常用在锁或者资源的开释场景较多;配套的两个行为代码能够放在最近的地位
:创立&开释、加锁&放锁、前置&后置,使得代码更易读,编程体验优良。最近的中央是哪里?下一行
提早调用
package mainfunc main() { defer println("--- defer ---") println("--- end ---")}
defer 会在main函数之前调用。
外围要点:
提早调用
:defer 语句自身尽管是 main 的第一行,然而 fmt.Println 是先打印的;defer 关键字肯定是处于函数上下文
:defer 必须放在函数外部
LIFO
一个函数内有多个defer时,压栈式执行,后入先出。
package mainimport "fmt"func main() { defer func() { fmt.Println("1") }() defer func() { fmt.Println("2") }()}
异样场景
留神:肯定要先注册defer,放在函数第一行,放到如下代码return之前,是无奈捕捉异样的;
package mainimport "fmt"func main() { defer func() { if err := recover(); err != nil { fmt.Println("捕捉panic", err) } }() var sliceOne []int sliceOne[0] = 1 return}