关于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回答

ccmouse

2019-08-10

首先那个for i:= range c,是会不断地从c里面接收数据,直到c被close。

接收数据哪里如果不开goroutine,那就会在main里面等待c被close,而c 不被close的话,那就deadlock了。

如果在goroutine里接收数据,他同样也会一直等待c被close,但不是在main里面等待。main函数接下来sleep了3秒钟就结束了,main一旦结束,所有的goroutine都被回收,进程退出。所以这样不会触发deadlock


2
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程