package main
import (
"fmt"
)
func main() {
c:=make(chan int)
go print(c)
c<-1
c<-2
//保障协程运行完毕,主协程main运行结束之后,其他协程也全部结束
//time.Sleep(time.Duration(time.Second*5))
}
func print(c chan int){
for{
fmt.Println("============")
fmt.Println(<-c)
}
}
输出结果有两种:
============
1
============
2
============
============
1
============
产生不同输出结果的原因是,main生成的协程一直循环去信道c里面的数据,可能在循环取数过程中,main协程结束,此时,由main生成的协程也全部结束。如果想让print协程全部结束,可以执行
time.Sleep(time.Duration(time.Second*5))
,让main协程暂停5秒,输出结果为:
============
1
============
2
============
这是因为print协程在输出1,2后,再次准备从信道内取数,但是此时已经没有向信道内发送数据的操作,所以此时产生了阻塞,阻塞5秒后,main协程结束,全部协程结束。