package mainimport (
"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
============
【go协程实例-1】这是因为print协程在输出1,2后,再次准备从信道内取数,但是此时已经没有向信道内发送数据的操作,所以此时产生了阻塞,阻塞5秒后,main协程结束,全部协程结束。
推荐阅读
- Go|Docker后端部署详解(Go+Nginx)
- GO|GO,GO,GO!
- Go成长之路|go中判断空字符串、nil和len(t)的用法
- go编译tools
- go grpc安装与使用
- goroutine 调度原理
- Go|Go进阶之路——复杂类型
- Go进阶之路——变量
- Go进阶之路——流程控制语句