Jquery中文网 www.jquerycn.cn
Jquery中文网 >  后端编程  >  Go语言  >  正文 golang for循环_golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?...

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

发布时间:2021-05-22   编辑:www.jquerycn.cn
jquery中文网为您提供golang for循环,golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?...等资源,欢迎您收藏本站,我们将为您提供最新的golang for循环,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 := 接受通道c里的值,从输出结果里看出,确实从通道里读出了之前塞入通道的10,但是在通道关闭后,这个通道一直能读出内容。

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

  • x, ok := 返回的值里第一个x是通道内的值,ok是指通道是否关闭,当通道被关闭后,ok则返回false,因此可以根据这个进行操作。读一个已经关闭的通道为什么会出现false,可以看我之前的 对已经关闭的的chan进行读写,会怎么样?为什么? 。
  • 当返回的okfalse时,执行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,否则将有一直阻塞的风险。

文章推荐:

  • golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?
  • golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?
  • golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出私有变量的 tag?
  • golang面试题:json包变量不加tag会怎么样?
  • golang面试题:怎么避免内存逃逸?
  • golang面试题:简单聊聊内存逃逸?
  • golang面试题:字符串转成byte数组,会发生内存拷贝吗?
  • golang面试题:翻转含有中文、数字、英文字母的字符串
  • golang面试题:拷贝大切片一定比小切片代价大吗?
  • golang面试题:能说说uintptr和unsafe.Pointer的区别吗?
如果你想每天学习一个知识点?
到此这篇关于“golang for循环_golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?...”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang for循环_golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?...
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
Golang并发:并发协程的优雅退出
浅谈 Go 语言 select 的实现原理
golang goroutine 通知_深入golang之---goroutine并发控制与通信
golang编程技巧:利用GC机制优雅地关闭协程,避免内存泄漏
golang float32转float64精度丢失_golang 混合写屏障原理深入剖析,这篇文章给你梳理的明明白白!...
3.Go 语言基础之流程控制
Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作
golang append性能_GoLang定时器实现原理

[关闭]