Go RunTime写入管道,然后不关闭管道,然后正常执行。
为什么不关闭通道时没有死锁?
package main
import (
`fmt`
`time`
)
func product(num int) chan int {
ch := make(chan int, 1)
go func(num int) {
for i := 0; i < num; i++ {
ch <- i
}
}(num)
return ch
}
func main() {
in := product(100)
go func() {
for v := range in {
fmt.Println(v)
}
}()
time.Sleep(time.Second)
}
// 0 1 2 3 4 5 ...
答案 0 :(得分:2)
因为在任何情况下,两个goroutine都不会互相等待,而它们中的任何一个都可以继续执行。
您在单独的(非主要)goroutine中从通道中读取内容,与此同时,主要goroutine未被阻塞,并且在计时器达到1秒后退出。
如果将read for循环移至主goroutine,则会出现死锁错误。因为在这种情况下,由于您尝试读取的通道未关闭并且没有人再写入该程序,因此该程序将永远被阻塞。