近期在學習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