func main() {
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬主機(jī)、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、海晏網(wǎng)站維護(hù)、網(wǎng)站推廣。
m := martini.Classic()
m.Get("/device/:serialnumber" , func(params martini.Params) string {
detail := GetDeviceState(params["serialnumber"])
result , _ := json.Marshal(detail)
return string(result)
})
m.Get("/device/ctrl/:serialnumber/:state" , func(params martini.Params) string {
detail := DeviceStateUpdate(params["serialnumber"] , params["state"])
result , _ := json.Marshal(detail)
return string(result)
})
由于linux的socket監(jiān)聽(tīng)機(jī)制和TCP協(xié)議,多個(gè)進(jìn)程無(wú)法監(jiān)聽(tīng)同一個(gè)端口,但是具體到nginx,可以多個(gè)nginx進(jìn)程監(jiān)聽(tīng)到不同端口,通過(guò)一個(gè)主進(jìn)程端口做upstream來(lái)實(shí)現(xiàn)負(fù)載均衡,這個(gè)有點(diǎn)類(lèi)似于網(wǎng)絡(luò)的匯聚,可以設(shè)置不同的策略,比如iphash,urlhash或者RR。
Go里面提供了一個(gè)關(guān)鍵字select,通過(guò)select可以監(jiān)聽(tīng)channel上的數(shù)據(jù)流動(dòng)。
select的用法與switch語(yǔ)言非常類(lèi)似,由select開(kāi)始一個(gè)新的選擇塊,每個(gè)選擇條件由case語(yǔ)句來(lái)描述。
與switch語(yǔ)句相比, select有比較多的限制,其中最大的一條限制就是每個(gè)case語(yǔ)句里必須是一個(gè)IO操作,大致的結(jié)構(gòu)如下:
在一個(gè)select語(yǔ)句中,Go語(yǔ)言會(huì)按順序從頭至尾評(píng)估每一個(gè)發(fā)送和接收的語(yǔ)句。
如果其中的任意一語(yǔ)句可以繼續(xù)執(zhí)行(即沒(méi)有被阻塞),那么就從那些可以執(zhí)行的語(yǔ)句中任意選擇一條來(lái)使用。
如果沒(méi)有任意一條語(yǔ)句可以執(zhí)行(即所有的通道都被阻塞),那么有兩種可能的情況:
如果給出了default語(yǔ)句,那么就會(huì)執(zhí)行default語(yǔ)句,同時(shí)程序的執(zhí)行會(huì)從select語(yǔ)句后的語(yǔ)句中恢復(fù)。
如果沒(méi)有default語(yǔ)句,那么select語(yǔ)句將被阻塞,直到至少有一個(gè)通信可以進(jìn)行下去
有時(shí)候會(huì)出現(xiàn)goroutine阻塞的情況,那么我們?nèi)绾伪苊庹麄€(gè)程序進(jìn)入阻塞的情況呢?我們可以利用select來(lái)設(shè)置超時(shí),通過(guò)如下的方式實(shí)現(xiàn):
select總結(jié):
作用: 用來(lái)監(jiān)聽(tīng) channel 上的數(shù)據(jù)流動(dòng)方向。 讀?寫(xiě)?
select實(shí)現(xiàn)fibonacci數(shù)列: