求问:for-range 在循环 channel 的时候,在 channel 里面没有数据的时候,为什么没有结束循环

ArdenDare · · 1660 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

萌新求问: 在下面的一段程序中,我们创建了一个容量为 4 的 channel,然后启动 goroutine 去遍历这个 channel。然后主协程往 channel 里面写入数据。 我的问题是:go 底层是如何实现的,为什么 goroutine 中的 for-range,不会在 ch <- 6 这一步,就直接结束了遍历呢?毕竟后面的数据,还没有写入到 channel 中,而且,我在 for-range 的过程中,sleep 了 5 秒 ``` package main import ( "fmt" "time" ) func main() { ch := make(chan int, 4) quitChan := make(chan bool) go func() { for v := range ch { fmt.Println(v) } quitChan <- true // 通知用的channel,表示这里的程序已经执行完了 }() ch <- 1 ch <- 2 ch <- 3 ch <- 4 ch <- 5 ch <- 6 fmt.Println("sleep 5 second") time.Sleep(time.Second * 5) // goroutine 里面的 for range,为什么不会在执行到这一步的时候,就结束了循环了 ch <- 7 ch <- 8 ch <- 9 close(ch) // 用完关闭channel <-quitChan // 接到channel通知后解除阻塞,这也是channel的一种用法 } ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1660 次点击  
加入收藏 微博
4 回复  |  直到 2022-10-18 15:05:52
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传