package main
import (
"fmt"
"time"
)
func main() {
p := producer()
for c := range p {
fmt.Println(c)
}
}
func producer() <-chan string {
ch := make(chan string)
go func() {
for i := 0; i < 5; i++ {
ch <- fmt.Sprint("hello", i)
time.Sleep(1 * time.Second)
}
// commented the below to show the issue
// close(ch)
}()
return ch
}
运行上面的代码将打印5条消息,然后给出一个“所有去例程是睡眠 - 死锁错误”。我明白,如果我关闭了频道,错误消失了。了解走通道死锁
我想了解的是,运行时如何知道代码将无限期地等待在通道上,并且没有其他任何事情将数据发送到通道中。
现在,如果我为main()函数添加额外的例程,它不会抛出任何错误并持续等待通道。
go func() {
for {
time.Sleep(2 * time.Millisecond)
}
}()
那么,这是否意味着.. Go运行时只是寻找一个运行去例程可能将数据发送到通道中,因此不扔僵局错误的存在?
感谢@Eddy R代表的信息。尝试给+1,但由于我的低点,系统不允许。 – tblogger