Go 語言 select 都能做什么垫蛆?

原文鏈接: Go 語言 select 都能做什么炫乓?

在 Go 語言中,select 是一個關鍵字,用于監(jiān)聽和 channel 有關的 IO 操作。

通過 select 語句,我們可以同時監(jiān)聽多個 channel衫画,并在其中任意一個 channel 就緒時進行相應的處理。

本文將總結一下 select 語句的常見用法府瞄,以及在使用過程中的注意事項碧磅。

基本語法

select 語句的基本語法如下:

select {
case <-channel1:
    // 通道 channel1 就緒時的處理邏輯
case data := <-channel2:
    // 通道 channel2 就緒時的處理邏輯
default:
    // 當沒有任何通道就緒時的默認處理邏輯
}

看到這個語法,很容易想到 switch 語句遵馆。

雖然 select 語句和 switch 語句在表面上有些相似鲸郊,但它們的用途和功能是不同的。

switch 用于條件判斷货邓,而 select 用于通道操作秆撮。不能在 select 語句中使用任意類型的條件表達式,只能對通道進行操作换况。

使用規(guī)則

雖然語法簡單职辨,但是在使用過程中盗蟆,還是有一些地方需要注意,我總結了如下四點:

  1. select 語句只能用于通道操作舒裤,用于在多個通道之間進行選擇喳资,以監(jiān)聽通道的就緒狀態(tài),而不是用于其他類型的條件判斷腾供。
  2. select 語句可以包含多個 case 子句仆邓,每個 case 子句對應一個通道操作。當其中任意一個通道就緒時伴鳖,相應的 case 子句會被執(zhí)行节值。
  3. 如果多個通道都已經(jīng)就緒,select 語句會隨機選擇一個通道來執(zhí)行榜聂。這樣確保了多個通道之間的公平競爭搞疗。
  4. select 語句的執(zhí)行可能是阻塞的,也可能是非阻塞的须肆。如果沒有任何一個通道就緒且沒有默認的 default 子句匿乃,select 語句會阻塞,直到有一個通道就緒休吠。如果有 default 子句扳埂,且沒有任何通道就緒,那么 select 語句會執(zhí)行 default 子句瘤礁,從而避免阻塞。

多路復用

select 最常見的用途之一梅尤,同時監(jiān)聽多個通道柜思,并根據(jù)它們的就緒狀態(tài)執(zhí)行不同的操作。

package main

import (
    "fmt"
    "time"
)

func main() {
    c1 := make(chan string)
    c2 := make(chan string)

    go func() {
        time.Sleep(3 * time.Second)
        c1 <- "one"
    }()

    go func() {
        time.Sleep(3 * time.Second)
        c2 <- "two"
    }()

    select {
    case msg := <-c1:
        fmt.Println(msg)
    case msg := <-c2:
        fmt.Println(msg)
    }
}

執(zhí)行上面的代碼巷燥,程序會隨機打印 one 或者 two赡盘,如果通道為空的話,程序就會一直阻塞在那里缰揪。

非阻塞通信

當通道中沒有數(shù)據(jù)可讀或者沒有緩沖空間可寫時陨享,普通的讀寫操作將會阻塞。

但通過 select 語句钝腺,我們可以在沒有數(shù)據(jù)就緒時執(zhí)行默認的邏輯抛姑,避免程序陷入無限等待狀態(tài)。

package main

import (
    "fmt"
)

func main() {
    channel := make(chan int)

    select {
    case data := <-channel:
        fmt.Println("Received:", data)
    default:
        fmt.Println("No data available.")
    }
}

執(zhí)行上面代碼艳狐,程序會執(zhí)行 default 分支定硝。

輸出:

No data available.

超時處理

通過結合 selecttime.After 函數(shù),我們可以在指定時間內(nèi)等待通道就緒毫目,超過時間后執(zhí)行相應的邏輯蔬啡。

package main

import (
    "fmt"
    "time"
)

func main() {
    channel := make(chan int)

    select {
    case data := <-channel:
        fmt.Println("Received:", data)
    case <-time.After(3 * time.Second):
        fmt.Println("Timeout occurred.")
    }
}

執(zhí)行上面代碼诲侮,如果 channel3 秒內(nèi)沒有數(shù)據(jù)可讀,select 會執(zhí)行 time.After 分支箱蟆。

輸出:

Timeout occurred.

以上就是本文的全部內(nèi)容沟绪,如果覺得還不錯的話歡迎點贊轉(zhuǎn)發(fā)關注空猜,感謝支持近零。


推薦閱讀:

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抄肖,一起剝皮案震驚了整個濱河市久信,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漓摩,老刑警劉巖裙士,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異管毙,居然都是意外死亡腿椎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門夭咬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啃炸,“玉大人,你說我怎么就攤上這事卓舵∧嫌茫” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵掏湾,是天一觀的道長裹虫。 經(jīng)常有香客問我,道長融击,這世上最難降的妖魔是什么筑公? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮尊浪,結果婚禮上匣屡,老公的妹妹穿的比我還像新娘。我一直安慰自己拇涤,他們只是感情好捣作,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著工育,像睡著了一般虾宇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上如绸,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天嘱朽,我揣著相機與錄音旭贬,去河邊找鬼。 笑死搪泳,一個胖子當著我的面吹牛稀轨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岸军,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼奋刽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了艰赞?” 一聲冷哼從身側(cè)響起佣谐,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎方妖,沒想到半個月后狭魂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡党觅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年雌澄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杯瞻。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡镐牺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魁莉,到底是詐尸還是另有隱情睬涧,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布沛厨,位于F島的核電站宙地,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逆皮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一参袱、第九天 我趴在偏房一處隱蔽的房頂上張望电谣。 院中可真熱鬧,春花似錦抹蚀、人聲如沸剿牺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晒来。三九已至,卻和暖如春郑现,著一層夾襖步出監(jiān)牢的瞬間湃崩,已是汗流浹背荧降。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留攒读,地道東北人朵诫。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像薄扁,于是被迫代替她去往敵國和親剪返。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • File: select.go select.go這個文件是Go語言運行時(runtime)中的一個模塊邓梅,主要負責...
    cuishuang閱讀 107評論 0 0
  • 通過select語句可以監(jiān)聽channel上的數(shù)據(jù)流動 Golang的select語句類似于UNIX的select...
    JunChow520閱讀 809評論 1 1
  • [TOC] 導讀 select是一種go可以處理多個通道之間的機制脱盲,看起來和switch語句很相似,但是selec...
    tracy_668閱讀 19,103評論 0 5
  • 非原創(chuàng)日缨,搬運工 目錄總匯 鏈接[http://www.reibang.com/p/c613e24ecb41] 思...
    溫嶺夾糕閱讀 378評論 0 1
  • 1.go版本的hello world 和C語言相似钱反,go語言的基本組成有:*包聲明,編寫源文件時殿遂,必須在非注釋的第...
    孤寡老人sos閱讀 364評論 0 0