教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang关于defer执行顺序的面试题

golang关于defer执行顺序的面试题

发布时间:2022-01-09   编辑:jiaochengji.com
教程集为您提供golang关于defer执行顺序的面试题等资源,欢迎您收藏本站,我们将为您提供最新的golang关于defer执行顺序的面试题资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><blockquote>

这段代码的执行结果是什么?

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">defer_call</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">defer_call</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">defer</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"打印前"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"打印中"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"打印后"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token function">panic</span><span class="token punctuation">(</span><span class="token string">"触发异常"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code class="lang-go hljs"><span class="token comment">//执行结果</span> 打印后 打印中 打印前 <span class="token builtin">panic</span><span class="token punctuation">:</span> 触发异常 goroutine <span class="token number">1</span> <span class="token punctuation">[</span>running<span class="token punctuation">]</span><span class="token punctuation">:</span> main<span class="token punctuation">.</span><span class="token function">defer_call</span><span class="token punctuation">(</span><span class="token punctuation">)</span> D<span class="token punctuation">:</span><span class="token operator">/</span>golandWorkapace<span class="token operator">/</span>src<span class="token operator">/</span>cn<span class="token punctuation">.</span>basecommon<span class="token operator">/</span>offer<span class="token operator">/</span>offer1<span class="token operator">/</span>main<span class="token punctuation">.</span><span class="token keyword">go</span><span class="token punctuation">:</span><span class="token number">15</span> <span class="token operator"> </span><span class="token number">0x97</span> main<span class="token punctuation">.</span><span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> D<span class="token punctuation">:</span><span class="token operator">/</span>golandWorkapace<span class="token operator">/</span>src<span class="token operator">/</span>cn<span class="token punctuation">.</span>basecommon<span class="token operator">/</span>offer<span class="token operator">/</span>offer1<span class="token operator">/</span>main<span class="token punctuation">.</span><span class="token keyword">go</span><span class="token punctuation">:</span><span class="token number">8</span> <span class="token operator"> </span><span class="token number">0x17</span> Process finished with exit code <span class="token number">2</span> </code></pre> <blockquote>

defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic

</blockquote> <blockquote>

每个defer中会保存上一个定义的defer方法地址 执行完会去寻找调用上一个定义的defer

</blockquote> 到此这篇关于“golang关于defer执行顺序的面试题”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
go那些事儿|defer必掌握知识
16.defer让代码更清晰
【Go学习】一道简单Golang面试题中关于panic和defer的执行顺序引发的惨案
golang中的defer recover panic
Golang Defer详解
golang 面试题(十一)
Golang中defer关键字实现原理
defer ,panic,recover
Golang面试题总结
golang 中多个 defer 的执行顺序

[关闭]
~ ~