变量捕获
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/
转载文章受原作者版权保护。转载请注明原作者出处!