最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang的select多路復用及channel使用操作

 更新時間:2020年12月21日 15:55:30   作者:piperck  
這篇文章主要介紹了Golang的select多路復用及channel使用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

看到有個例子實現(xiàn)了一個類似于核彈發(fā)射裝置,在發(fā)射之前還是需要隨時能輸入終止發(fā)射。

這里就可以用到cahnnel 配合select 實現(xiàn)多路復用。

select的寫法用法有點像switch。但是和switch不同的是,select的一個case代表一個通信操作(在某個channel上進行發(fā)送或者接收)并且會包含一些語句組成的一個語句塊。現(xiàn)在讓我們來實現(xiàn)一下這個核彈發(fā)射器

package main
import (
 "fmt"
 "time"
 "os"
)
func launch() {
 fmt.Println("nuclear launch detected")
}
func commencingCountDown(canLunch chan int) {
 c := time.Tick(1 * time.Second)
 for countDown := 20; countDown > 0; countDown-- {
  fmt.Println(countDown)
  <- c
 }
 canLunch <- -1
}
func isAbort(abort chan int) {
 os.Stdin.Read(make([]byte, 1))
 abort <- -1
}
func main() {
 fmt.Println("Commencing coutdown")
 abort := make(chan int)
 canLunch := make(chan int)
 go isAbort(abort)
 go commencingCountDown(canLunch)
 select {
 case <- canLunch:
 case <- abort:
  fmt.Println("Launch aborted!")
  return
 }
 launch()
}

首先打印了一個commencing countdown開始進行倒數(shù)計時。

申明一個int類型的 channel變量abort 用來做取消時候傳遞給select的消息信號量這個后面會介紹到。

申明一個int類型的 channel變量canLunch 用來做倒計時結(jié)束可以發(fā)射的信號量。 只有當?shù)箶?shù)結(jié)束,且canLunch有值后才能進行發(fā)射。

用一個goroutine開啟一個用于監(jiān)聽是否有停止發(fā)射信號的函數(shù)isAbort并且把申明好的channel變量傳入。

isAbort就干一件事情,監(jiān)聽是否有標準輸入輸入,如果有輸入我們默認是下達了發(fā)射停止的信號 需要向abort channel里面發(fā)送一個信號。這里我們會發(fā)射一個-1

用一個goroutine開啟一個用于倒數(shù)計時的函數(shù)commencingCountDown負責開始倒計時,這里重新申明了一個 TICK channel 每一秒倒數(shù)計時一下。并且在倒數(shù)計時完成之后向canLunch channel發(fā)送信號。

然后開始執(zhí)行select,select在沒有就緒的channel的時候會阻塞或者執(zhí)行指定的defualt,這里我沒有寫default所以他會阻塞監(jiān)聽兩個信號,一個是canLunch,一個是停止發(fā)送。只要收到任何一個信號后,執(zhí)行該信號后面的內(nèi)容

最后運行Lunch函數(shù)。

其實把思路理清楚,以并發(fā)的思考方式去思考這類問題感覺還是不會太亂。多加練習應該會變好。下面的文章應該會開始逐步開始從服務器和連接開始,實現(xiàn)一個im系統(tǒng)。或者添加更多的實踐。

補充:golang 使用select完成超時

我就廢話不多說了,大家還是直接看代碼吧~

timeout := make(chan bool, 1)
go func() {
 time.Sleep(1e9)
 timeout <- true
} ()
 
select {
 case <- ch:
  //從ch中讀取數(shù)據(jù)
 case <-timeout:
  //ch一直沒有數(shù)據(jù)寫入,超時觸發(fā)timeout
}
func main() {
 var a chan string
 a =make(chan string)
 go sendDataTo(a)
 go timing()
 getAchan(10*time.Second,a) 
}
 
func sendDataTo(a chan string) {
 for {
   a <- "我是a通道的數(shù)據(jù)"
  time.Sleep(1e9 *3)
 }
}
 
//在一定時間內(nèi)接收不到a的數(shù)據(jù)則超時
func getAchan(timeout time.Duration, a chan string) {
 var after <-chan time.Time
 loop:
 after = time.After(timeout)
 for{
  fmt.Println("等待a中的數(shù)據(jù),10秒后沒有數(shù)據(jù)則超時")
  select {
  case x :=<- a:
   fmt.Println(x)
   goto loop
  case <-after:
   fmt.Println("timeout.")
   return
  }
 }
}
func timing() {
 //定時器,10秒鐘執(zhí)行一次
 ticker := time.NewTicker(10 * time.Second)
 for {
  time := <-ticker.C
  fmt.Println("定時器====>",time.String())
 }
} 

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Go語言設(shè)置JSON的默認值操作

    Go語言設(shè)置JSON的默認值操作

    這篇文章主要介紹了Go語言設(shè)置JSON的默認值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • sublime安裝支持go和html的插件

    sublime安裝支持go和html的插件

    這篇文章主要介紹了sublime安裝支持go和html的插件,需要的朋友可以參考下
    2015-01-01
  • Go并發(fā)之RWMutex的源碼解析詳解

    Go并發(fā)之RWMutex的源碼解析詳解

    RWMutex是一個支持并行讀串行寫的讀寫鎖。RWMutex具有寫操作優(yōu)先的特點,寫操作發(fā)生時,僅允許正在執(zhí)行的讀操作執(zhí)行,后續(xù)的讀操作都會被阻塞。本文就來從源碼解析一下RWMutex的使用
    2023-03-03
  • 如何理解Go函數(shù)是一等公民原理及使用場景

    如何理解Go函數(shù)是一等公民原理及使用場景

    這篇文章主要為大家介紹了如何理解Go函數(shù)是一等公民及使用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • go語言int64整型轉(zhuǎn)字符串的實現(xiàn)

    go語言int64整型轉(zhuǎn)字符串的實現(xiàn)

    本文主要介紹了go語言int64整型轉(zhuǎn)字符串的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • go build -tags的其他用法命令詳解

    go build -tags的其他用法命令詳解

    go build -tags和go install -tags中的-tags 參數(shù)功能完全一致(都是通過標簽控制編譯哪些代碼),核心區(qū)別在于 go build 和 go install 這兩個命令本身的行為差異,而非 -tags的用法,本文介紹go build -tags的其他用法,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息

    Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息

    這篇文章主要介紹了Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Golang AGScheduler動態(tài)持久化任務調(diào)度的強大庫使用實例

    Golang AGScheduler動態(tài)持久化任務調(diào)度的強大庫使用實例

    這篇文章主要為大家介紹了Golang AGScheduler動態(tài)持久化任務調(diào)度的強大庫使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Go時間操作常用方法(推薦!)

    Go時間操作常用方法(推薦!)

    平時開發(fā)過程中,時間相關(guān)的操作用的還是很多的,下面這篇文章主要給大家介紹了關(guān)于Go時間操作常用方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 解析Go 標準庫 http.FileServer 實現(xiàn)靜態(tài)文件服務

    解析Go 標準庫 http.FileServer 實現(xiàn)靜態(tài)文件服務

    http.FileServer 方法屬于標準庫 net/http,返回一個使用 FileSystem 接口 root 提供文件訪問服務的 HTTP 處理器。下面通過本文給大家介紹Go 標準庫 http.FileServer 實現(xiàn)靜態(tài)文件服務的相關(guān)知識,感興趣的朋友一起看看吧
    2018-08-08

最新評論

翼城县| 瓦房店市| 美姑县| 榆社县| 武乡县| 房产| 玉田县| 吴桥县| 浮山县| 潞城市| 安福县| 宁都县| 北宁市| 富宁县| 新竹县| 正宁县| 兰考县| 宁蒗| 成武县| 德格县| 繁峙县| 宁蒗| 奇台县| 沾化县| 潜山县| 峨眉山市| 南岸区| 习水县| 江油市| 乐至县| 石嘴山市| 云龙县| 隆安县| 武汉市| 丹江口市| 汉源县| 东乌珠穆沁旗| 汉源县| 海林市| 金沙县| 孟连|