defer
defer可以说是go的一个很牛逼的功能了,将函数暂存,延时执行。
defer语句只能出现在函数或方法的内部。表明在当前函数执行完了再执行要延时的函数。哪怕当前函数崩了。
defer语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放。释放资源的defer应该直接跟在请求资源的语句后。
比如,我在当前函数申请了一堆资源,或者加上了锁,然后用defer延时调用一个释放资源、释放锁的函数。保证不会锁死,哪怕当前函数崩了,也不会锁死。
package main //必须
import "fmt"
func main() {
a := 10
b := 20
defer func(a, b int) {
fmt.Printf("a = %d, b = %d\n", a, b) //a = 10, b = 20
}(a, b)
defer func(a, b int) {
fmt.Printf("传进来:a = %d, b = %d\n", a, b) //传进来:a = 10, b = 20
a = 100
fmt.Printf("改了之后:a = %d, b = %d\n", a, b) //改了之后:a = 100, b = 20
}(10, 20) //()代表调用此匿名函数, 把参数传递过去,已经先传递参数,只是没有调用
b = 222
//这里会是还没改的
fmt.Printf("外部:a = %d, b = %d\n", a, b) //外部:a = 10, b = 222
//故意挂掉
result := 100 / 0
/**打印顺序
外部:a = 10, b = 222
传进来:a = 10, b = 20
改了之后:a = 100, b = 20
a = 10, b = 20
报错:go:24:16: division by zero
*/
}
通过执行顺序可以看出来,延时的顺序也是栈的顺序。
网友评论