ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 概述 关键字defer用于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行 .注意 :defer语句只能出现现 在函数或方法的内部 . defer语句经常被用于处理承兑的操作,如打开,关闭,连接,断开连接,加锁,释放锁. 通 过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放 . 释放资源的defer应该直接跟 在请求资源的语句后 .如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行 .哪怕函数或 某个延迟调用发生错误,这些调用依旧会被执行. 该关键字类似析构函数 . ### 实例 ~~~ func main() { defer fmt.Println("1") defer fmt.Println("2") fmt.Println("3") } ~~~ ~~~ 3 2 1 ~~~ ### 发生错误依然会继续执行 ~~~ func main() { defer fmt.Println("1") defer test(0) defer fmt.Println("2") fmt.Println("3") } func test(num int) (res int) { res = 100 / num return } ~~~ ~~~ 3 2 1 panic: runtime error: integer divide by zero goroutine 1 [running]: main.test(0x0, 0x1) /Users/artisan/go/src/awesomeProject/test.go:13 +0x40 main.main() /Users/artisan/go/src/awesomeProject/test.go:10 +0x13f ~~~ #### defer和匿名函数结合使用 ~~~ func main() { num1 := 10 num2 := 20 defer func(a, b int) { fmt.Println(a, b) }(num1, num2) //这里已经把参数传递进去了,只是没有调用 num1 = 100 num2 = 200 fmt.Println(num1, num2) } ~~~