日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Go開發(fā)Channel徹底研究之Select基礎(chǔ)

為什么需要select?

有時(shí)會遇到這種情景:需要對多個channel進(jìn)行監(jiān)聽。

目前創(chuàng)新互聯(lián)建站已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、管城網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

如圖所示,就像一個人監(jiān)聽多個通道一樣,假如采用for循環(huán)形式

for{
d1,ok:=<-c1
//...
d2,ok:=<-c2
//...
....
}

這個方式肯定走不通,原因是一旦某個通道監(jiān)聽阻塞了,下面的部分都不會執(zhí)行到。有沒有一種方法,像治安巡查一樣一輪輪的輪詢,那么就可以解決這個問題了。

go提供了select,正對應(yīng)輪詢的思路,模式如下:

select{
case xx:
case xx:
case xx:
default:xx
}

運(yùn)行過程

從上往下“巡查”,如果發(fā)現(xiàn)哪個case處于可執(zhí)行狀態(tài),就執(zhí)行該條語句,那么其余語句就不執(zhí)行了。

如果都不能執(zhí)行,且有default語句時(shí),就執(zhí)行default

如果沒有default語句,那么select整個就會阻塞(導(dǎo)致所在協(xié)程阻塞),直到解除。

但有人會有疑問,上面這些語句不是只能輪詢一次嗎?這個容易解決,我們給select外層再加一個for循環(huán),這樣就可以無限的輪詢。

for{
select{
case xx:
case xx:
........
}
}

模式基本形成了。

客戶和服務(wù)端交互模擬

下面先看一個基礎(chǔ)的例子,主要用來模仿客戶和服務(wù)端的交互,模型如下:

ch := make(chan string)

//模擬啟動服務(wù)端
go func(ch chan string) {
for {
data := <-ch
fmt.Println("服務(wù)端接收到數(shù)據(jù):", data)
time.Sleep(time.Second * 2)
//'roger'表示信息收到的意思..
ch <- "roger"
}
}(ch)

//模擬客戶端一次請求
ch <- "hello,服務(wù)端!"
select {
case ack := <-ch:
fmt.Println(ack)
case <-time.After(time.Second):
fmt.Println("返回超時(shí)...")

}

分析

  1. 服務(wù)端需要持續(xù)服務(wù),因此采用for無限循環(huán)形式
  2. 客戶端的返回值就是和超時(shí)進(jìn)行速度PK。

網(wǎng)站題目:Go開發(fā)Channel徹底研究之Select基礎(chǔ)
轉(zhuǎn)載來源:http://www.5511xx.com/article/coseiop.html