golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?

栏目: IT技术 · 发布时间: 6年前

golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?

golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?

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

  • for循环 select 时,如果其中一个case通道已经关闭,则每次都会执行到这个case。
  • 如果select里边只有一个case,而这个case被关闭了,则会出现死循环。

1.for循环里被关闭的通道

golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
  • c通道
    0
    main
    c通道
    10
    
  • main
    x, ok := 
    		

2.怎么样才能不读关闭后通道

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

3.如果select里只有一个已经关闭的case,会怎么样?

golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
  • 可以看出只有一个 case 的情况下,则会 死循环 。
  • 那如果像上面一个 case 那样,把通道置为 nil 就能解决问题了吗?

4.select里只有一个已经关闭的case,置为nil,会怎么样?

golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
  • 第一次读取 case 能读到通道里的 10
  • 第二次读取 case 能读到通道已经关闭的信息。此时将通道置为 nil
  • 第三次读取 case 时main协程会被阻塞,此时整个进程没有其他活动的协程了,进程 deadlock
  • select 中如果任意某个通道有值可读时,它就会被执行,其他被忽略。
  • default
    select
    select
    default
    

文章推荐:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Software Design 中文版 01

Software Design 中文版 01

[日] 技术评论社 / 人民邮电出版社 / 2014-3 / 39.00

《Software Design》是日本主流的计算机技术读物,旨在帮助程序员更实时、深入地了解前沿技术,扩大视野,提升技能。内容涵盖多平台软件开发技巧、云技术应用、大数据分析、网络通信技术、深度互联时代下的移动开发、虚拟化、人工智能等最前沿实践性讲解。以人脑思维模式,激发计算机操控的无限可能;以软件开发技巧,挖掘系统与硬件的最大价值。 《Software Design 中文版 01》的主题为......一起来看看 《Software Design 中文版 01》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具