常见问题
defer常见用法
1.使用defer Run(Run(1))
1234567891011121314151617func Run(i int)int{ fmt.Println("run") return 1}// 非匿名函数func main() { defer Run(Run(1)) fmt.Println("exec")}/**output:runexecrun*/
2.使用defer fun(){...}()
1234567891011121314func main() {// 匿名函数 defer fun(){ Run(Run(1)) }() fmt.Println("exec")}/**output:execrunrun*/
结论:
上述两种方式都是defer的正确用法,方式1常用于在做函数开始时调整环境,函数结束时恢复环境
的操作,方式2常用于在函数结束时批量清理操作
延伸:go源码中利用defer实现调整环境并后续恢复现场
的操作
|
|
debug.SetGCPercent
被执行了两次,而且这个函数返回的是上一次GC的值,因此defer在这里的用途是还原到调用此函数之前的GC设置,也就是恢复现场
defer返回值的坑
- 多个defer的执行顺序为“后进先出”;
- defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。
return并非原子操作,分为赋值和返回值两步操作
|
|
|
|