理解 Golang 中的 Select 語句

Select 語句和 Swithc 語句的句式十分相似片迅,但是 Select 中的 Case 必須是一個通信操作(一個 Channel 操作)。其執(zhí)行邏輯是:哪一個 Case 后面的 Channel 操作可以被成功執(zhí)行签则,則執(zhí)行該 Case 下的代碼塊靴庆。如果同時多個 Case 可被成功執(zhí)行册养,則隨機(jī)選擇其中一個构拳。如果所有 Case 均不可被成功執(zhí)行蕊梧,則執(zhí)行 default 下的代碼塊。如果沒有 default 則會阻塞并返回死鎖錯誤腮介。

在學(xué)習(xí)過程中肥矢,看到一些文章寫到 select 語句的作用是

監(jiān)聽 IO 操作,當(dāng) IO 操作發(fā)生時叠洗,觸發(fā)相應(yīng)的動作甘改。

這個說法是對的,監(jiān)聽(Channel 的) IO 操作并作出相應(yīng)動作確實(shí)是 Select 的應(yīng)用場景灭抑,但是千萬不要誤以為 Select 語句是在選擇哪個 case 下的 Channel 操作被執(zhí)行了十艾!這么理解是錯的!Select 真正會選擇的是哪個 case 下的 Channel 操作可以被成功執(zhí)行腾节,則執(zhí)行該 case 下的代碼塊忘嫉。
比如,當(dāng)一個 Channel c1 被寫入一條數(shù)據(jù)

c1 := make(chan string, 1)
c1 <- "Hello World!"

如果我們有以下 Select 判斷語句

select {
    case <-c1:
        fmt.Println("Case 1 is selected")
    case c1<-"Hello World!":
        fmt.Println("Case 2 is selected")
    default :
        fmt.Println("Default is selected")
}

你會得到如下結(jié)果案腺,

Case 1 is selected

因?yàn)?c1 被寫入了一條數(shù)據(jù)庆冕,所以我們可以成功 “從 c1 讀出一條數(shù)據(jù)”。也就是第一個 case 可以被成功執(zhí)行劈榨。所以访递,第一個 case 下的代碼塊最終被執(zhí)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末同辣,一起剝皮案震驚了整個濱河市拷姿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旱函,老刑警劉巖响巢,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棒妨,居然都是意外死亡抵乓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門靶衍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灾炭,“玉大人,你說我怎么就攤上這事颅眶◎诔觯” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵涛酗,是天一觀的道長铡原。 經(jīng)常有香客問我偷厦,道長,這世上最難降的妖魔是什么燕刻? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任只泼,我火速辦了婚禮,結(jié)果婚禮上卵洗,老公的妹妹穿的比我還像新娘。我一直安慰自己过蹂,他們只是感情好十绑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酷勺,像睡著了一般本橙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脆诉,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天甚亭,我揣著相機(jī)與錄音,去河邊找鬼击胜。 笑死狂鞋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潜的。 我是一名探鬼主播骚揍,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啰挪!你這毒婦竟也來了信不?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亡呵,失蹤者是張志新(化名)和其女友劉穎抽活,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锰什,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡下硕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了汁胆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梭姓。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嫩码,靈堂內(nèi)的尸體忽然破棺而出誉尖,到底是詐尸還是另有隱情,我是刑警寧澤铸题,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布铡恕,位于F島的核電站琢感,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏探熔。R本人自食惡果不足惜驹针,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诀艰。 院中可真熱鬧柬甥,春花似錦、人聲如沸涡驮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捉捅。三九已至,卻和暖如春虽风,著一層夾襖步出監(jiān)牢的瞬間棒口,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工辜膝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留无牵,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓厂抖,卻偏偏與公主長得像茎毁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子忱辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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