关于defer使用的问题

来源:3-16 api之session处理与实现(下)

白小九jiu

2020-04-16

关于 defer 使用的问题

西西老师,我看到你的代码里defer函数都是在最后一行返回之前,但是我测试,如果之前有err的话,函数不会执行最后那个defer 语句,这个close()函数是不是就失效了呀。我觉得defer放在图中划线的地方比较好。您看下是不是?
图片描述
下图是测试函数,我专门写错sql语句,但是test的时候没有执行defer 9999语句,那close是不是也执行不了?
错误的sql语句测试结果

写回答

1回答

艾文西

2020-04-18

首先你这个验证是对的,defer确实有一些出栈操作顺序的坑。

不过这个例子恰好相反,我们需要预先判断打开dbConn是否会出错,如果出错,是拿不到相应的资源的,这个时候提前返回反而不会panic,如果这个时候还defer,那么有可能会报空指针异常等问题。只有err为空,defer的时候关闭资源才能正常关闭

0
1
白小九jiu
非常感谢!
2020-04-27
共1条回复

Go语言实战流媒体视频网站,高效学习Go高性能开发

从零开始,全面掌握Go语言编码的架构风格和开发Web的关键技能

996 学习 · 268 问题

查看课程