萌新求问:
在下面的一段程序中,我们创建了一个容量为 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的一种用法
}
```
更多评论
比如我上面的程序,因为 sleep 了 5 秒钟,我观察到,for range 也会等待 sleep 5 秒之后,再继续输出后面的 7、8、9。感觉这个现象很神奇。也就是说,for range 会等待 channel 关闭,才会退出吗?
#2