defer关键字使用
参考解析
题目来源:快手
答案:
defer是Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源、关闭数据库连接、断开socket连接、解锁一个加锁的资源。Go语言机制担保一定会执行defer语句中的代码。Go中的defer析构的是函数。
一、defer语句执行时机
defer语句在函数返回之前 或者 函数中 return语句(return语句可能调用另一个函数) 之后执行。
二、多个defer语句的执行顺序是逆序执行
当出现多条 defer 语句时以逆序执行(类似栈,即后进先出)。
三、defer与panic
1、在panic语句后面的defer语句不被执行
2、在panic语句前的defer语句会被执行。 Go中的panic类似其它语言中的抛出异常,panic后面的代码不再执行(panic语句前面的defer语句会被执行)。
四、return 的实现逻辑
1、第一步给返回值赋值(若是有名返回值直接赋值,匿名返回值 则 先声明再 赋值) ;
2、第二步调用RET返回指令并传入返回值,RET会检查是否存在defer语句,若存 在就先逆序插播 defer语句 ;
3、最后 RET 携带返回值退出函数 。
可以看出 , return 不是一个原子操作,函数返回值与 RET 返回值并不一定一致。
五、defer、 return、返回值三者顺序
defer、 return、返回值 三者的执行顺序是 : return 最先给返回值赋值;接着 defer 开始执行一些收尾工作;最后 RET 指令携带返回值退出函数。