亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Golang中switch語句和select語句的用法教程

2020-04-01 19:05:09
字體:
來源:轉載
供稿:網友

本文主要給大家介紹了關于Golang中switch和select用法的相關內容,分享出來供大家參考學習,下面來一起看看詳細的介紹:

一、golang/254226.html">golang/73518.html">switch語句

switch語句提供了一個多分支條件執行的方法。每一個case可以攜帶一個表達式或一個類型說明符。前者又可被簡稱為case表達式。因此,Go語言的switch語句又分為表達式switch語句和類型switch語句。

1、表達式switch語句

var name string ... switch name { case "Golang":  fmt.Println("Golang") case "Rust":  fmt.Println("Rust") default:  fmt.Println("PHP是世界上最好的語言") } 

Go會依照從上至下的順序對每一條case語句中case表達式進行求值,只要被發現其表達式與switch表達式的結果相同,該case語句就會被選中。其余的case語句會被忽略。   與if相同,switch語句還可以包含初始化字句,且其出現位置和寫法如出一轍:

names := []string{"Golang","java","PHP"} switch name:=names[0];name { case "Golang":  fmt.Println("Golang") ... default:  fmt.Println("Unknown") } 

2、類型switch語句

類型switch語句與一般形式有兩點差別。第一點,緊隨case關鍵字的不是表達式,而是類型說明符。類型說明符由若干個類型字面量組成,且多個類型字面量之間由英文逗號分隔。第二點,它的switch表達式是非常特殊的。這種特殊的表達式也起到了類型斷言的作用,但其表現形式很特殊,如:v.(type) , 其中v必須代表一個接口類型的值。該類表達式只能出現在類型switch語句中,且只能充當switch表達式。一個類型switch語句的示例如下:

v := 11 switch i := interface{}(v).(type) { case int, int8, int16, int32, int64:  fmt.Println("A signed integer:%d. The type is %T. /n", v, i) case uint, uint8, uint16, uint32, uint64:  fmt.Println("A unsigned integer: %d. The type is %T. /n", v, i) default:  fmt.Println("Unknown!") } 

我們這里把switch表達式的結果賦給了一個變量。如此以來,我們就可以在該switch語句中使用這個結果了。這段代碼被執行后,輸出:"A signed integer:11. The type is int. "

最后說一下fallthrough。它既是一個關鍵字,又可以代表一條語句。fallthrough語句可被包含在表達式switch語句中的case語句中。它的作用是使控制權流轉到下一個case。不過要注意fallthrough語句僅能作為case語句中的最后一條語句出現。并且,包含它的case語句不是其所屬switch語句的最后一條case語句。

二、select語句

golang 的 select 的功能和 select, poll, epoll 相似, 就是監聽 IO 操作,當 IO 操作發生時,觸發相應的動作。

示例:

ch1 := make (chan int, 1) ch2 := make (chan int, 1)  ...  select { case <-ch1:  fmt.Println("ch1 pop one element") case <-ch2:  fmt.Println("ch2 pop one element") } 

注意到 select 的代碼形式和 switch 非常相似, 不過 select 的 case 里的操作語句只能是【IO 操作】 。

此示例里面 select 會一直等待等到某個 case 語句完成, 也就是等到成功從 ch1 或者 ch2 中讀到數據。 則 select 語句結束。

break語句也可以被包含在select語句中的case語句中。它的作用是立即結束當前的select語句的執行。不論其所屬的case語句中是否還有未被執行的語句。

【使用 select 實現 timeout 機制】

如下:

timeout := make(chan bool, 1) go func() {  time.Sleep(time.Second * 10)  timeout <- true }() select { case <-pssScanResponseChan:  case <-timeout:  fmt.PrintIn("timeout!") } 

當超時時間到的時候,case2 會操作成功。 所以 select 語句則會退出。 而不是一直阻塞在 ch 的讀取操作上。 從而實現了對 ch 讀取操作的超時設置。

下面這個更有意思一點。

當 select 語句帶有 default 的時候:

ch1 := make (chan int, 1) ch2 := make (chan int, 1)  select { case <-ch1:  fmt.Println("ch1 pop one element") case <-ch2:  fmt.Println("ch2 pop one element") default:  fmt.Println("default") } 

此時因為 ch1 和 ch2 都為空,所以 case1 和 case2 都不會讀取成功。 則 select 執行 default 語句。

就是因為這個 default 特性, 我們可以使用 select 語句來檢測 chan 是否已經滿了。

如下:

ch := make (chan int, 1) ch <- 1 select { case ch <- 2: default:  fmt.Println("channel is full !") } 

因為 ch 插入 1 的時候已經滿了, 當 ch 要插入 2 的時候,發現 ch 已經滿了(case1 阻塞住), 則 select 執行 default 語句。 這樣就可以實現對 channel 是否已滿的檢測, 而不是一直等待。

比如我們有一個服務, 當請求進來的時候我們會生成一個 job 扔進 channel, 由其他協程從 channel 中獲取 job 去執行。 但是我們希望當 channel 瞞了的時候, 將該 job 拋棄并回復 【服務繁忙,請稍微再試?!?就可以用 select 實現該需求。

此外,利用default特性,我們可以使用select語句將chan清空,如下:

flag := false for {  select {  case <-pssScanResponseChan:  continue  default:  flag = true  }  if true == flag {  break  } } 

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久中文字幕久久av| 国产精品免费一区二区三区都可以| 日韩综合中文字幕| 欧美性xxxxx极品娇小| 国产精品成av人在线视午夜片| 中国china体内裑精亚洲片| 国产黑人绿帽在线第一区| 亚洲精品免费av| 日本不卡高字幕在线2019| 欧美夫妻性生活视频| 这里只有视频精品| 在线成人激情视频| 97精品久久久| 懂色aⅴ精品一区二区三区蜜月| 日韩激情av在线播放| 136fldh精品导航福利| 国产91色在线免费| 国内精品美女av在线播放| 日韩有码在线视频| 黄色一区二区三区| 欧美日韩国产成人| 亚洲中国色老太| 国产精品视频区1| 精品国产一区二区三区久久久| 国产成人综合精品| 亚洲va欧美va在线观看| 欧美日韩免费区域视频在线观看| 精品亚洲国产成av人片传媒| 欧美电影免费播放| 91国语精品自产拍在线观看性色| 亚洲日韩中文字幕在线播放| 最近中文字幕mv在线一区二区三区四区| 97视频网站入口| 午夜免费久久久久| 精品呦交小u女在线| 日韩精品免费看| 久久久女人电视剧免费播放下载| 欧美激情视频在线免费观看 欧美视频免费一| 久久久999精品视频| 国产精品jvid在线观看蜜臀| 少妇久久久久久| 欧洲成人在线视频| 91超碰中文字幕久久精品| 亚洲精品720p| 成人xvideos免费视频| 日本成人激情视频| 欧美精品激情视频| 国产欧美一区二区三区在线| 欧美区在线播放| 国产日产欧美a一级在线| 欧美大胆a视频| 国产成人高清激情视频在线观看| 欧美性猛交丰臀xxxxx网站| 中文字幕在线看视频国产欧美| 国产精品久久久久久久久久东京| 国产精品直播网红| 国产日韩中文字幕| 国产视频丨精品|在线观看| 精品中文视频在线| 精品色蜜蜜精品视频在线观看| 欧美亚洲日本网站| 欧美激情在线狂野欧美精品| 高清欧美性猛交xxxx黑人猛交| 97婷婷大伊香蕉精品视频| 91av国产在线| 久久青草福利网站| 91亚洲人电影| 日韩欧美国产中文字幕| 日韩精品免费综合视频在线播放| 亚洲毛茸茸少妇高潮呻吟| 精品无码久久久久久国产| 日韩中文字幕在线播放| 国产mv久久久| 欧美成人黑人xx视频免费观看| 亚洲精品乱码久久久久久按摩观| 日韩精品电影网| 国产成人精品久久亚洲高清不卡| 欧美精品18videos性欧美| 成人网欧美在线视频| 亚洲国产精品久久| 精品国产91久久久久久| 日韩精品欧美国产精品忘忧草| 久久夜色撩人精品| 96pao国产成视频永久免费| 亚洲香蕉伊综合在人在线视看| 欧美大片免费观看在线观看网站推荐| 国内伊人久久久久久网站视频| 疯狂蹂躏欧美一区二区精品| 久久精品国产99国产精品澳门| 伊人久久精品视频| 国产精品video| 国产日本欧美视频| 欧美日韩国产区| 亚洲女人天堂网| 日韩视频中文字幕| 91久久久久久| 在线一区二区日韩| 亚洲国产91色在线| 国产视频一区在线| 欧美在线免费观看| 精品久久久久久久久久久久久| 欧美性猛交xxxx偷拍洗澡| 亚洲a成v人在线观看| 欧美激情手机在线视频| 欧美日韩黄色大片| 精品欧美aⅴ在线网站| 有码中文亚洲精品| 欧美裸体男粗大视频在线观看| 久久噜噜噜精品国产亚洲综合| 午夜精品久久久久久久99热| 国语自产偷拍精品视频偷| 欧美精品久久久久久久久| 国产精品三级久久久久久电影| 国产精品成人免费视频| 久久视频国产精品免费视频在线| 久久99热精品| 亚洲国产精品国自产拍av秋霞| 久久99久久久久久久噜噜| 久久久久久久久国产精品| 欧美专区日韩视频| 日韩精品黄色网| 中文字幕亚洲综合| 激情懂色av一区av二区av| 国产狼人综合免费视频| 国产日韩欧美夫妻视频在线观看| 日韩欧美国产黄色| 欧美成人激情视频免费观看| 午夜精品久久久久久久99热| 欧美精品在线第一页| 亚洲成人999| 欧美性猛交xxxx乱大交| 日韩在线视频免费观看| 另类图片亚洲另类| 亚洲国语精品自产拍在线观看| 韩日精品中文字幕| 亚洲九九九在线观看| 亚洲综合最新在线| 欧美成人亚洲成人| 国产精品久久久久91| 亚洲精品国产品国语在线| 欧美在线不卡区| 精品国产一区二区三区久久狼5月| 国产精品久久久久久久久影视| 欧美在线中文字幕| 欧美一级高清免费| 琪琪亚洲精品午夜在线| 夜夜躁日日躁狠狠久久88av| 国产精品久久久91| 国产精品v日韩精品| 日韩av在线一区二区| 日韩精品极品视频免费观看| 久久久精品中文字幕| 538国产精品一区二区在线| 国产精品xxxxx| 日韩在线观看你懂的| 日韩综合视频在线观看| 欧美日韩国产丝袜美女| 欧美日本高清视频| 国产精品免费一区| 欧美日韩免费看| 亚洲最新视频在线| 国产精品一区二区三区毛片淫片| 国产亚洲欧洲黄色| 日韩中文字幕不卡视频|