关于range
来源:11-1 channel

慕数据3065326
2019-08-08
func main() {
//chanClose()
c := make(chan int)
//发送数据
go func() {
for i := 0; i < 10; i++ {
c <- i
}
//close(c)
}()
//接收数据
go func() {
for i := range c {
fmt.Println(i)
}
}()
time.Sleep(time.Second * 3)
}
`
在接收数据那里如果不开goroutine会报错deadlock,解决方案是发送数据里close(c),
如果开了goroutine就不需要close(c)为什么呢?
写回答
1回答
-
首先那个for i:= range c,是会不断地从c里面接收数据,直到c被close。
接收数据哪里如果不开goroutine,那就会在main里面等待c被close,而c 不被close的话,那就deadlock了。
如果在goroutine里接收数据,他同样也会一直等待c被close,但不是在main里面等待。main函数接下来sleep了3秒钟就结束了,main一旦结束,所有的goroutine都被回收,进程退出。所以这样不会触发deadlock
20
相似问题