golang的defer踩坑汇总

变量捕获

defer中的变量会被提前捕获,后续的修改不会影响到已捕获的值,举个例子:

结果defer语句中打印的值是修改前的值。:

最后输出值: 10

Defer运行值: 0

变量名返回值

在defer中修改具体变量名返回值时,会影响到函数的实际返回值,继续举个例子:

非变量名返回值

当函数为非具体名返回值时,defer无法影响返回值(因在return时,对应返回值已存入栈中),继续举个例子:

经过上面的实践理解,我们来看下下面的笔试题:

问题解析:这里return先给result赋值为3,之后执行defer,result变为21,最后返回21。

问题解析:这里return确定返回值3,之后defer才修改result,最后函数返回return确定的返回值3。

问题解析:多个defer函数,按顺序逆序执行,这里输出31 32 33 1 2 3 。

问题解析:由于这里的defer指定的func为nil,所以会panic 。

问题解析:这里是极度容易踩坑的地方,由于defer这里调用的func没有参数,等执行的时候,i已经为0(按3 2 1逆序,最后一个i=1时,i–的结果最后是0),所以这里输出3个0 。

如果还不太好理解?

按照常规的思维理解应该是这样:

感兴趣的朋友可以细细品下。

Original: https://www.cnblogs.com/phpper/p/16389393.html
Author: 周伯通之草堂
Title: golang的defer踩坑汇总

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516279/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球