select 語句使得一個(gè) goroutine 在多個(gè)通訊操作上等待。
創(chuàng)新互聯(lián)建站憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營(yíng)銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了網(wǎng)站制作、做網(wǎng)站服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
select 會(huì)阻塞,直到條件分支中的某個(gè)可以繼續(xù)執(zhí)行,這時(shí)就會(huì)執(zhí)行那個(gè)條件分支。當(dāng)多個(gè)都準(zhǔn)備好的時(shí)候,會(huì)隨機(jī)選擇一個(gè)。
復(fù)制代碼代碼如下:
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select {
case c - x:
x, y = y, x + y
case -quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i 10; i++ {
fmt.Println(-c)
}
quit - 0
}()
fibonacci(c, quit)
}
默認(rèn)選擇
當(dāng) select 中的其他條件分支都沒有準(zhǔn)備好的時(shí)候,default 分支會(huì)被執(zhí)行。
為了非阻塞的發(fā)送或者接收,可使用 default 分支:
select {
case i := -c:
// use i
default:
// receiving from c would block
}
復(fù)制代碼代碼如下:
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(1e8)
boom := time.After(5e8)
for {
select {
case -tick:
fmt.Println("tick.")
case -boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(" .")
time.Sleep(5e7)
}
}
}
1 select語句的每個(gè)case語句必須IO操作
2 執(zhí)行 case 語句順序是隨機(jī)的
3 select的每個(gè)case(包含default)語句是阻塞的
4 如果case語句均發(fā)生阻塞,那么執(zhí)行default語句
Go里面提供了一個(gè)關(guān)鍵字select,通過select可以監(jiān)聽channel上的數(shù)據(jù)流動(dòng)。
select的用法與switch語言非常類似,由select開始一個(gè)新的選擇塊,每個(gè)選擇條件由case語句來描述。
與switch語句相比, select有比較多的限制,其中最大的一條限制就是每個(gè)case語句里必須是一個(gè)IO操作,大致的結(jié)構(gòu)如下:
在一個(gè)select語句中,Go語言會(huì)按順序從頭至尾評(píng)估每一個(gè)發(fā)送和接收的語句。
如果其中的任意一語句可以繼續(xù)執(zhí)行(即沒有被阻塞),那么就從那些可以執(zhí)行的語句中任意選擇一條來使用。
如果沒有任意一條語句可以執(zhí)行(即所有的通道都被阻塞),那么有兩種可能的情況:
如果給出了default語句,那么就會(huì)執(zhí)行default語句,同時(shí)程序的執(zhí)行會(huì)從select語句后的語句中恢復(fù)。
如果沒有default語句,那么select語句將被阻塞,直到至少有一個(gè)通信可以進(jìn)行下去
有時(shí)候會(huì)出現(xiàn)goroutine阻塞的情況,那么我們?nèi)绾伪苊庹麄€(gè)程序進(jìn)入阻塞的情況呢?我們可以利用select來設(shè)置超時(shí),通過如下的方式實(shí)現(xiàn):
select總結(jié):
作用: 用來監(jiān)聽 channel 上的數(shù)據(jù)流動(dòng)方向。 讀?寫?
select實(shí)現(xiàn)fibonacci數(shù)列:
當(dāng)前題目:go語言中default,go語言中文社區(qū)
分享地址:http://chinadenli.net/article0/dsshpio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、建站公司、商城網(wǎng)站、網(wǎng)站改版、網(wǎng)站制作、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)