Golang提供了一種稱為通道的機制,用于在協程之間共享數據。當函數作為協程執行并發活動時,需要它們共享資源或數據,通道便充當協程之間的管道(管道),提供一種確保同步交換數據的機制。
需要在聲明通道時指定數據類型,可以共享任何類型的值和指針。數據在通道上傳遞:在任何給定的時間,只有一個協程可以訪問數據項:因此在設計上是不會發生資源競爭的情況。
根據數據交換的行為,有兩種類型的通道:無緩沖通道和緩沖通道。無緩沖通道用于在協程之間執行同步通信,而緩沖通道用于執行異步通信。在發送和接收數據瞬間,無緩沖通道保證數據交換是在兩個協程之間執行,緩沖通道沒有這樣的保證。
通道由make函數創建,該函數指定chan關鍵字和通道的元素類型。
創建無緩沖和有緩沖的通道

內置函數make能夠用來創建無緩沖和有緩沖的通道,參數指定chan關鍵字和的要交換的數據類型
使用操作符

從通道中取出值

無緩沖通道
無緩沖通道沒有指定容量來保存值。因此,在傳輸任何數據之前,這種類型的通道要求發送和接收數據的協程在同一時刻都要準備就緒。如果兩個協程在相同的時刻還未準備好,則通道將使執行數據傳輸的兩個協程阻塞等待對方。同步是在通道上發送和接收數據的基礎,發送和接受數據雙方一個都不能少。
緩沖通道
緩沖通道有指定的容量來保存值。這種類型的通道,不強制傳輸數據的協程雙方在同一時刻準備好執行發送和接收,通過阻塞協程來協調雙方的通信。與無緩沖通道不同,緩沖通道發送或接收的阻塞有不一樣的情況:只有在通道中沒有要接收的值時,接收方會阻塞;只有在沒有可用緩沖區來放置要發送的值時,發送方才會阻塞。

每次運行此程序時,輸出的結果不同,這是因為程序和Go調度程序的隨機性。
在上面的程序中,創建一個字符串類型的緩沖通道,其容量為10。WaitGroup的計數是5,代表5個協程。將10個字符串發送到通道中,以模擬協程所要做的工作。最后一個字符串發送到通道后,通道將關閉,主函數將等待所有項目完成。