一、簡介
channel 不僅可以用於 goroutine 間進行安全通信,還可以用於同步內存訪問。
而且 Go 社區強烈推薦使用 channel 通道實現 goroutine 之間的通信,
不要通過共享內存來通信,而應該通過通信來共享內存。
Go 從語言層面保證了同一時間只有一個 goroutine 能夠訪問 channel 裏的數據,從而保證數據安全。
在 Go 中使用 channel 通信,通過通信來傳遞內存數據,讓內存數據可以在不同的 goroutine 之間進行傳遞,而不是
用共享內存來通信。
二、channel 的基本使用
前面有 2 篇文章介紹 chanel 的使用:
-
https://www.cnblogs.com/jiujuan/p/11723586.html goroutine 協程和 channel 通道
-
https://www.cnblogs.com/jiujuan/p/16014608.html golang 中 channel 的詳細使用、使用注意事項及死鎖分析
還有 1 篇講 channel 的原理:
- https://www.cnblogs.com/jiujuan/p/12026551.html 深入理解Go語言:channel原理
三、channel 使用注意事項
關閉 channel
- 一般由發送端關閉 channel
- 向一個已經關閉的 channel 發送數據,會 panic
- 讀取關閉的 channel ,返回零值
nil channel
- 讀取一個 nil channel,操作將阻塞
所以需要阻塞時,你可以手動修改 channel 爲 nil,就會出現阻塞效果。
for...range... 遍歷channel
當 for range 遍歷 channel 時,如果發送者沒有關閉 channel 或在 range 之後關閉,會導致死鎖。