Golang Channel 的用法

golang也看了一段時間
沒什麼大進度
感覺回到了C懷抱
但又方便的多
尤其併發的控制上

其實程式到最後都會走向一條道路上
就是便於修改與維護
最近遇到的難題就是
golang與python不太一樣
本身不支持物件導向,因此要練習寫得像物件導向
多看別人的code是一定要的
但自己總是想不到如何使用...



回到正題
今天要說的就是併發控制上的利器: channel
還有記錄一些看別人教學後應用遇到的一些問題

channel可以當作資料在goroutine之間的傳遞使用,也可以當作signal來觸發goroutine使用。channel可以是雙向的也可以是單向的。channel是先進先出的對列。

channel只要達到以下條件,就會阻塞執行緒

  • 讀取的時候,channel緩衝區沒有東西
  • 寫入的時候,緩衝區滿

依照這2個特性,可以對go routine做控制

宣告可以使用 var 或是用 make
var EmitSignal chan int
EmitSignal := make(chan int, 1)
後面的值代表channel的緩衝區大小

宣告時要注意的是,如果是沒有宣告緩衝,那一定要建好channel的emit跟reciever,才能對channel做操作,不然會直接阻塞。

使用方向符號,對channel做操作
# 賦予緩衝區資料 EmitSignal <- 1 # 取得緩衝區 data := <-EmitSignal

另外還可以使用
v, ok := <-cha接收值順便確認
也支援使用
cap()查詢channel的緩衝區容量
len()查詢channel緩衝區的數據長度,也就是已經在緩衝區的數目。
注意哦,緩衝區容量跟緩衝區長度是不一樣的
容量是channel最多可裝多少資料,長度是目前裝了多少資料。
close()關閉channel
這裡使用上要注意,閉了一個channel,其等待的goroutine會被關閉!
channel只能被關閉一次,如果被關閉第二次,會引發panic。

補充:
當channel已關閉,並且buf不為空時,還是能正常讀取buf中的值,並且第二個值ok為true。

我最常使用在
一個go routine 送出channel後觸發另一個go routine的執行
並且很常搭配select使用

佶令: 當有這樣的一種程式語言出現:它能讓工程師用簡單的英語寫程式,你將會發現,工程師都開始不會說英語。(Anonymous Linguist)

沒有留言:

張貼留言

About

努力在程式的大海
用力的揮動雙手
找出屬於自己的航線

Blog Archive

Traffic