golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
for
循环 select
时,如果通道已经关闭会怎么样?如果 select
中的 case
只有一个,又会怎么样?
-
for循环
select时,如果其中一个case通道已经关闭,则每次都会执行到这个case。 -
如果select里边只有一个case,而这个case被关闭了,则会出现死循环。
1.for循环里被关闭的通道
-
c通道 0 main c通道 10
-
main x, ok :=
2.怎么样才能不读关闭后通道
-
x, ok := <-c返回的值里第一个x是通道内的值,ok是指通道是否关闭,当通道被关闭后,ok则返回false,因此可以根据这个进行操作。读一个已经关闭的通道为什么会出现false,可以看我之前的 对已经关闭的的chan进行读写,会怎么样?为什么? 。 -
当返回的
ok为false时,执行c = nil将通道置为nil,相当于读一个未初始化的通道,则会一直阻塞。至于为什么读一个未初始化的通道会出现阻塞,可以看我的另一篇 对未初始化的的chan进行读写,会怎么样?为什么? 。select中如果任意某个通道有值可读时,它就会被执行,其他被忽略。则select会跳过这个阻塞case,可以解决不断读已关闭通道的问题。
3.如果select里只有一个已经关闭的case,会怎么样?
-
可以看出只有一个
case的情况下,则会死循环。 -
那如果像上面一个
case那样,把通道置为nil就能解决问题了吗?
4.select里只有一个已经关闭的case,置为nil,会怎么样?
-
第一次读取
case能读到通道里的10 -
第二次读取
case能读到通道已经关闭的信息。此时将通道置为nil -
第三次读取
case时main协程会被阻塞,此时整个进程没有其他活动的协程了,进程deadlock
-
select中如果任意某个通道有值可读时,它就会被执行,其他被忽略。 -
default select select default
文章推荐:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
函数响应式领域建模
【美】Debasish Ghosh / 李源 / 电子工业出版社 / 2018-1 / 79
传统的分布式应用不会切入微服务、快速数据及传感器网络的响应式世界。为了捕获这些应用的动态联系及依赖,我们需要使用另外一种方式来进行领域建模。由纯函数构成的领域模型是以一种更加自然的方式来反映一个响应式系统内的处理流程,同时它也直接映射到了相应的技术和模式,比如Akka、CQRS 以及事件溯源。《函数响应式领域建模》讲述了响应式系统中建立领域模型所需要的通用且可重用的技巧——首先介绍了函数式编程和响......一起来看看 《函数响应式领域建模》 这本书的介绍吧!