<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">go語言的channel是非常重要的組成部分, 因爲go的核心-併發一定要用到這個.</span>
我們知道併發在很多時候都是要進行通信的. go語言的併發通信是推薦我們使用channel 來進行, 也就是基於消息傳遞模型的併發通信.
(1)創建channel.
go中的內置類型, 我們使用make(自定義類型使用new--返回對象指針)
ch := make(chan int)
這樣就創建了一個channel, 當然我麼也可以先聲明, 在分配創建.
var ch chan int
ch = make(chan int)
(2)帶緩衝
ch := make(chan int, 10)
上面的意思就是創建一個名爲ch的channel, 裏面的類型爲int, 緩衝值爲10.
什麼是緩衝?
如果沒有這個緩衝值, 我們在讀取channel的時候, 一定要channel裏面準備好, 否則就阻塞起來. 在寫的時候, 一定要裏面沒有值, 否則也會阻塞. 將程序掛起, 死鎖.
有了這個緩衝值, 我們如果channel裏面有<=10值的時候 , 我麼讀取是不阻塞 , 即時返回的. 在裏面的<10個的時候, 寫入也是即時返回的. 這樣就不會將程序掛起啦.
(3)我們也可以創建單向,和雙向的channel. 這個是 根據 現有的channel創建的, 僅僅是加上一些約束.
(4)讀channel
value := <-ch
(5)寫channelch <- value
(6)range語法.
for one := range chOut {
//one的操作
}
上面的range要注意一下, 如果chOut在生產者放入數據之後, 沒有顯式關閉channel, 那麼range會阻塞在該線程中.
因爲range 不看到 channel的顯式關閉, 是不會停止的.
解決方法有兩個:
1 在數據放入channel後顯式關閉.
close(chOut)
2 判斷一下
for one := range chOut {
if i := len(chOut); i <= 0 {
break
}
}