golang 的channel

<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)寫channel
ch <- 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
	}
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章