Channel的理解
Channel是Go中的一個核心類型,可以把它看成一個管道,通過它並發核心單元就可以發送或者接收數據進行通訊(communication),Channel也可以理解是一個先進先出的隊列,通過管道進行通信。
Golang的Channel,發送一個數據到Channel和從Channel接收一個數據都是原子性的。
Go的設計思想就是,不要通過共享內存來通信,而是通過通信來共享內存,前者就是傳統的加鎖,后者就是Channel。
也就是說,設計Channel的主要目的就是在多任務間傳遞數據,所以本身就是安全的。
帶緩沖區和不帶緩沖區的區別
1)緩沖區大小不同
不帶緩沖區的chan緩沖區大小是0,帶緩沖區的chan緩沖區至少是1
2)運行方式不同
帶緩沖區的channel:【同步】
寫入阻塞條件:緩沖區滿;
取出阻塞條件:緩沖區沒有數據。
不帶緩沖區的channel:【異步】
寫入阻塞條件:同一時間沒有另外一個線程對該chan進行讀操作;
取出阻塞條件:同一時間沒有另外一個線程對該chan進行寫操作。
channel存在3種狀態
nil:未初始化的狀態,只進行了聲明,或者手動賦值為nil,nil狀態的chan是不能close(panic: close of nil channel);
active:正常的channel,可讀或者可寫 ;
closed:已關閉,千萬不要誤認為關閉channel后,channel的值是nil,關閉的狀態的chan仍然可以讀值(取值),但不能寫值(會報panic: send on closed channel)。
func main() { var a chan int fmt.Println(a) // <nil>
a = make(chan int) close(a) fmt.Println(a) // 0xc00003e060
}
channel可進行3種操作
總結
發生 panic 的情況有三種:向一個關閉的 channel 進行寫操作;重復關閉一個 channel;關閉一個 nil 的 channel。
發生 阻塞(死鎖)的情況:讀、寫一個 nil的 channel。