Go開(kāi)發(fā)工程師
未來(lái)3-5年企業(yè)高性能項(xiàng)目不可替代的語(yǔ)言,從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)再到重構(gòu),真正從入門(mén)到精通
select
語(yǔ)句屬于條件分支流程控制方法,不過(guò)它只能用于通道。它可以包含若干條case
語(yǔ)句,并根據(jù)條件選擇其中的一個(gè)執(zhí)行。進(jìn)一步說(shuō),select
語(yǔ)句中的case
關(guān)鍵字只能后跟用于通道的發(fā)送操作的表達(dá)式以及接收操作的表達(dá)式或語(yǔ)句。示例如下:
ch1 := make(chan int, 1) ch2 := make(chan int, 1) // 省略若干條語(yǔ)句 select { case e1 := <-ch1: fmt.Printf("1th case is selected. e1=%v.\n", e1) case e2 := <-ch2: fmt.Printf("2th case is selected. e2=%v.\n", e2) default: fmt.Println("No data!") }
如果該select
語(yǔ)句被執(zhí)行時(shí)通道ch1
和ch2
中都沒(méi)有任何數(shù)據(jù),那么肯定只有default case
會(huì)被執(zhí)行。但是,只要有一個(gè)通道在當(dāng)時(shí)有數(shù)據(jù)就不會(huì)輪到default case
執(zhí)行了。顯然,對(duì)于包含通道接收操作的case
來(lái)講,其執(zhí)行條件就是通道中存在數(shù)據(jù)(或者說(shuō)通道未空)。如果在當(dāng)時(shí)有數(shù)據(jù)的通道多于一個(gè),那么Go語(yǔ)言會(huì)通過(guò)一種偽隨機(jī)的算法來(lái)決定哪一個(gè)case
將被執(zhí)行。
另一方面,對(duì)于包含通道發(fā)送操作的case
來(lái)講,其執(zhí)行條件就是通道中至少還能緩沖一個(gè)數(shù)據(jù)(或者說(shuō)通道未滿)。類似的,當(dāng)有多個(gè)case
中的通道未滿時(shí),它們會(huì)被隨機(jī)選擇。請(qǐng)看下面的示例:
ch3 := make(chan int, 100) // 省略若干條語(yǔ)句 select { case ch3 <- 1: fmt.Printf("Sent %d\n", 1) case ch3 <- 2: fmt.Printf("Sent %d\n", 2) default: fmt.Println("Full channel!") }
該條select
語(yǔ)句的兩個(gè)case
中包含的都是針對(duì)通道ch3
的發(fā)送操作。如果我們把這條語(yǔ)句置于一個(gè)循環(huán)中,那么就相當(dāng)于用有限范圍的隨機(jī)整數(shù)集合去填滿一個(gè)通道。
請(qǐng)注意,如果一條select
語(yǔ)句中不存在default case
, 并且在被執(zhí)行時(shí)其中的所有case
都不滿足執(zhí)行條件,那么它的執(zhí)行將會(huì)被阻塞!當(dāng)前流程的進(jìn)行也會(huì)因此而停滯。直到其中一個(gè)case
滿足了執(zhí)行條件,執(zhí)行才會(huì)繼續(xù)。我們一直在說(shuō)case
執(zhí)行條件的滿足與否取決于其操作的通道在當(dāng)時(shí)的狀態(tài)。這里特別強(qiáng)調(diào)一點(diǎn),即:未被初始化的通道會(huì)使操作它的case
永遠(yuǎn)滿足不了執(zhí)行條件。對(duì)于針對(duì)它的發(fā)送操作和接收操作來(lái)說(shuō)都是如此。
最后提一句,break
語(yǔ)句也可以被包含在select
語(yǔ)句中的case
語(yǔ)句中。它的作用是立即結(jié)束當(dāng)前的select
語(yǔ)句的執(zhí)行,不論其所屬的case
語(yǔ)句中是否還有未被執(zhí)行的語(yǔ)句。
在命令源碼文件index.go的第 15 行和第 18 行添加一條語(yǔ)句,使該文件被執(zhí)行時(shí)會(huì)在標(biāo)準(zhǔn)輸出上打印出:
No Data! 1 End.
在第15行添加
close(ch4)
在第18行添加
ch4 <- 1
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書(shū)簽
舉報(bào)