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

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

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进行读写,会怎么样?为什么?
  • 当返回的 okfalse 时,执行 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
    

文章推荐:


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

查看所有标签

猜你喜欢:

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

C语言接口与实现

C语言接口与实现

(美)David R. Hanson / 人民邮电出版社 / 2010-8 / 79.00元

可重用的软件模块是构建大规模可靠应用程序的基石,创建可重用的软件模块是每个程序员和项目经理必须掌握的技能。C语言对创建可重用的API提供的语言和功能支持非常少,虽然C程序员写应用时都会用到API和库,但却很少有人去创建和发布新的能广泛应用的API。本书介绍用一种基于接口的设计方法创建可重用的API,这一方法将接口与实现分离开来,且与语言无关。书中详细描述了24个接口及其实现,便于读者深入了解此方法......一起来看看 《C语言接口与实现》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

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

HEX HSV 互换工具