近期在学习golang的goroutine和channel时候有一些疑惑:golang
经过下面的代码咱们能够获得答案并发
输出:函数
Washington Tripoli London Beijing tokyo
main() 函数中启动了两个协程:sendData() 经过通道 ch 发送了 5 个字符串,getData() 按顺序接收它们并打印出来。
若是 2 个协程须要通讯,你必须给他们同一个通道做为参数才行。学习
尝试一下若是注释掉 time.Sleep(1e9) 会如何。code
---- Error run E:/Go/Goboek/code examples/chapter 14/goroutine2.exe with code Crashed ---- Program exited with code -2147483645: panic: all goroutines are asleep-deadlock!
为何会这样?运行时会检查全部的协程(也许只有一个是这种状况)是否在等待(能够读取或者写入某个通道),意味着程序没法处理。这是死锁(deadlock)形式,运行时能够检测到这种状况。协程
注意:不要使用打印状态来代表通道的发送和接收顺序:因为打印状态和通道实际发生读写的时间延迟会致使和真实发生的顺序不一样。blog