Golang併發程式設計中select簡單瞭解

OldBoy~發表於2018-09-19

select可以監聽channel的資料流動
select的用法與switch語法非常類似,由select開始的一個新的選擇塊,每個選擇條件由case語句來描述

與switch語句可以選擇任何使用相等比較的條件相比,select由比較多的限制,其中最大的一條限制就是每個case語句裡必須是一個IO操作

select { //不停的在這裡檢測
case <-chanl : //檢測有沒有資料可以讀
//如果chanl成功讀取到資料,則進行該case處理語句
case chan2 <- 1 : //檢測有沒有可以寫
//如果成功向chan2寫入資料,則進行該case處理語句


//假如沒有default,那麼在以上兩個條件都不成立的情況下,就會在此阻塞//一般default會不寫在裡面,select中的default子句總是可執行的,因為會很消耗CPU資源
default:
//如果以上都沒有符合條件,那麼則進行default處理流程
}

在一個select語句中,Go會按順序從頭到尾評估每一個傳送和接收的語句。

如果其中的任意一個語句可以繼續執行(即沒有被阻塞),那麼就從那些可以執行的語句中任意選擇一條來使用。
如果沒有任意一條語句可以執行(即所有的通道都被阻塞),那麼有兩種可能的情況:
①如果給出了default語句,那麼就會執行default的流程,同時程式的執行會從select語句後的語句中恢復。
②如果沒有default語句,那麼select語句將被阻塞,直到至少有一個case可以進行下去。

相關文章