教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 c builder case内是局部变量吗_golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个...

c builder case内是局部变量吗_golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个...

发布时间:2022-01-06   编辑:jiaochengji.com
教程集为您提供c builder case内是局部变量吗,golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个...等资源,欢迎您收藏本站,我们将为您提供最新的c builder case内是局部变量吗,golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个...资源

问题

<code>for</code>循环<code>select</code>时,如果通道已经关闭会怎么样?如果<code>select</code>中的<code>case</code>只有一个,又会怎么样?

<h2>怎么答 </h2> <ul><li>for循环<code>select</code>时,如果其中一个case通道已经关闭,则每次都会执行到这个case。</li><li>如果select里边只有一个case,而这个case被关闭了,则会出现死循环。</li></ul><h2>解释 </h2> <h3>1.for循环里被关闭的通道</h3>

<ul><li><code>c通道</code>是一个缓冲为<code>0</code>的通道,在<code>main</code>开始时,启动一个协程对<code>c通道</code>写入<code>10</code>,然后就关闭掉这个通道。</li><li>在<code>main</code>中通过 <code>x, ok := <-c</code> 接受<code>通道c</code>里的值,从输出结果里看出,确实从通道里读出了之前塞入通道的<code>10</code>,但是在通道关闭后,这个通道一直能读出内容。</li></ul><h3>2.怎么样才能不读关闭后通道</h3>

<ul><li><code>x, ok := <-c</code> 返回的值里第一个x是通道内的值,<code>ok</code>是指通道是否关闭,当通道被关闭后,<code>ok</code>则返回<code>false</code>,因此可以根据这个进行操作。读一个已经关闭的通道为什么会出现false,可以看我之前的 对已经关闭的的chan进行读写,会怎么样?为什么? 。</li><li>当返回的<code>ok</code>为<code>false</code>时,执行<code>c = nil</code> 将通道置为<code>nil</code>,相当于读一个未初始化的通道,则会一直阻塞。至于为什么读一个未初始化的通道会出现阻塞,可以看我的另一篇 对未初始化的的chan进行读写,会怎么样?为什么? 。<code>select</code>中如果任意某个通道有值可读时,它就会被执行,其他被忽略。则<code>select</code>会跳过这个阻塞<code>case</code>,可以解决不断读已关闭通道的问题。</li></ul><h3>3.如果select里只有一个已经关闭的case,会怎么样?</h3>

<ul><li>可以看出只有一个<code>case</code>的情况下,则会<code>死循环</code>。</li><li>那如果像上面一个<code>case</code>那样,把通道置为<code>nil</code>就能解决问题了吗?</li></ul><h3>4.select里只有一个已经关闭的case,置为nil,会怎么样?</h3>

<ul><li>第一次读取<code>case</code>能读到通道里的<code>10</code></li><li>第二次读取<code>case</code>能读到通道已经关闭的信息。此时将通道置为<code>nil</code></li><li>第三次读取<code>case</code>时main协程会被阻塞,此时整个进程没有其他活动的协程了,进程<code>deadlock</code></li></ul><h2>总结 </h2> <ul><li><code>select</code>中如果任意某个通道有值可读时,它就会被执行,其他被忽略。</li><li>如果没有<code>default</code>字句,<code>select</code>将有可能阻塞,直到某个通道有值可以运行,所以<code>select</code>里最好有一个<code>default</code>,否则将有一直阻塞的风险。</li></ul><h2>文章推荐: </h2> <ul><li>对已经关闭的的 chan 进行读写,会怎么样?为什么?</li><li>对未初始化的的chan进行读写,会怎么样?为什么?</li><li>golang 面试题:​reflect(反射包)如何获取字段 tag​?为什么 json 包不能导出私有变量的 tag?</li><li>golang面试题:json包变量不加tag会怎么样?</li><li>golang面试题:怎么避免内存逃逸??</li><li>golang面试题:简单聊聊内存逃逸?</li><li>golang面试题:字符串转成byte数组,会发生内存拷贝吗?</li><li>golang面试题:翻转含有中文、数字、英文字母的字符串</li><li>golang面试题:拷贝大切片一定比小切片代价大吗?</li><li>golang面试题:能说说uintptr和unsafe.Pointer的区别吗?</li></ul><h3>如果你想每天学习一个知识点,关注我的【公】【众】【号】【golang小白成长记】。</h3>
到此这篇关于“c builder case内是局部变量吗_golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个...”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
c builder case内是局部变量吗_golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个...
golang for循环_golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?...
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
不要等离职了,才知道for select时,如果通道已经关闭会怎么样?
连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了
连怎么避免内存逃逸都不知道?怎么进BAT?
go channel 缓冲区最大限制_Golang 入门 : channel(通道)
android 读写串口中文字符串_golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?...
Golang并发:并发协程的优雅退出
golang编程技巧:利用GC机制优雅地关闭协程,避免内存泄漏

[关闭]
~ ~