1. 程式人生 > >Go語言-select語句

Go語言-select語句

 select語句屬於條件分支流程控制方法,不過它只能用於通道。它可以包含若干條case語句,並根據條件選擇其中的一個執行。進一步說,select語句中的case關鍵字只能後跟用於通道的傳送操作的表示式以及接收操作的表示式或語句。示例如下:

ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
// 省略若干條語句
select {
case e1 := <-ch1:
    fmt.Printf("1th case is selected. e1=%v.\n", e1)
case e2 := <-ch2:
    fmt.Printf("2th case is selected. e2=%v.\n", e2)
default:
    fmt.Println("No data!")
} 

    如果該select語句被執行時通道ch1ch2中都沒有任何資料,那麼肯定只有default case會被執行。但是,只要有一個通道在當時有資料就不會輪到default case執行了。顯然,對於包含通道接收操作的case來講,其執行條件就是通道中存在資料(或者說通道未空)。如果在當時有資料的通道多於一個,那麼Go語言會通過一種偽隨機的演算法來決定哪一個case將被執行。
   
   另一方面,對於包含通道傳送操作的case來講,其執行條件就是通道中至少還能緩衝一個數據(或者說通道未滿)。類似的,當有多個case中的通道未滿時,它們會被隨機選擇。請看下面的示例:

ch3 := make(chan int, 100)
// 省略若干條語句
select {
case ch3 <- 1:
    fmt.Printf("Sent %d\n", 1)
case ch3 <- 2:
    fmt.Printf("Sent %d\n", 2)
default:
    fmt.Println("Full channel!")
}

    該條select語句的兩個case中包含的都是針對通道ch3的傳送操作。如果我們把這條語句置於一個迴圈中,那麼就相當於用有限範圍的隨機整數集合去填滿一個通道。
   
    請注意,如果一條select語句中不存在default case, 並且在被執行時其中的所有case都不滿足執行條件,那麼它的執行將會被阻塞!當前流程的進行也會因此而停滯。直到其中一個case滿足了執行條件,執行才會繼續。我們一直在說case執行條件的滿足與否取決於其操作的通道在當時的狀態。這裡特別強調一點,即:未被初始化的通道會使操作它的case永遠滿足不了執行條件。對於針對它的傳送操作和接收操作來說都是如此。
  
    最後提一句,break

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

相關推薦

Go語言-select語句

 select語句屬於條件分支流程控制方法,不過它只能用於通道。它可以包含若干條case語句,並根據條件選擇其中的一個執行。進一步說,select語句中的case關鍵字只能後跟用於通道的傳送操作的表示式以及接收操作的表示式或語句。示例如下:ch1 := make(chan i

golang基礎學習---Go 語言 break 語句和continue語句

Go 語言 break 語句 Go 語言中 break 語句用於以下兩方面: 用於迴圈語句中跳出迴圈,並開始執行迴圈之後的語句。 break在switch(開關語句)中在執行一條case後跳出語句的作用。 示例 package main import "fmt" fu

golang基礎學習----go語言控制語句switch

Go 語言 switch 語句 switch 語句用於基於不同條件執行不同動作,每一個 case 分支都是唯一的,從上直下逐一測試,直到匹配為止。。 switch 語句執行的過程從上至下,直到找到匹配項,匹配項後面也不需要再加break 基本結構 相比較 C 和 Jav

Go語言-for語句

 for語句代表著迴圈。一條語句通常由關鍵字for、初始化子句、條件表示式、後置子句和以花括號包裹的程式碼塊組成。其中,初始化子句、條件表示式和後置子句之間需用分號分隔。示例如下:for i := 0; i < 10; i++ { fmt.Print(i, "

GO語言學習筆記(四)GO語言控制語句

浮點型 imp max 代碼 知識點 printf 有一個 port 輸出結果 一、小程序要求:輸出100以內能被2整除的數代碼如下: package main import "fmt" func main() { var max int = 100

探究 Go 語言 defer 語句的三種機制

Golang 的 1.13 版本 與 1.14 版本對 defer 進行了兩次優化,使得 defer 的效能開銷在大部分場景下都得到大幅降低,其中到底經歷了什麼原理? 這是因為這兩個版本對 defer 各加入了一項新的機制,使得 defer 語句在編譯時,編譯器會根據不同版本與情況,對每個 defer 選擇不

GO語言method、interface、reflection、select

語言 go method 方法method -GO方法雖沒有class,依舊有method -通過顯示說明receiver來實現與某個類型的組合 -只能為同一個包中的類型定義方法 -RECEIVER可以是類型的值或指針 -不存在方法重載 -可以使用值或指針來調用方法,編譯器會自動完成轉換 -從某種

Go語言【第五篇】:Go條件語句

receive 多個 inter ima comm 每一個 描述 進行 基於 Go語言條件 條件語句需要開發者通過指定一個或多個條件,並通過測試條件是否為true來決定是否執行指定語句,並在條件為false的情況再執行另外的語句。下圖展示了程序語言中條件語句的結構: Go

[日常] Go語言聖經-基於select的多路復用習題

string con print text 習題 true ont IT 語句 練習 8.8: 使用select來改造8.3節中的echo服務器,為其增加超時,這樣服務器可以在客戶端10秒中沒有任何喊話時自動斷開連接。 reverb3.go package main i

Go語言循環語句

ewma 語句 字符串 printf package nbsp () 語言 val Go語言循環語句 for循環 語法(形式) for init; condition; post { } : 和C語言中的for類似。init一般為賦值表達式,為控制變量賦

Go語言中的控制語句

sel pre pytho Go語言 跳轉 sele index project sleep // code_004_process_control project main.go package main import ( "fmt" "time" )

Go語言程式設計基礎 併發(二)(完結)——range、close、select、sync.Mutex

4 range和close 傳送者可以通過close關閉一個通道來表示沒有需要傳送的值了。接收者可以通過為接收表示式分配第二個引數來測試通道是否被關閉:如果沒有值可以接收且通道已被關閉,那麼執行完 v, ok := <-ch 之後,ok會被設定為false 迴圈for

易學筆記-go語言-第4章:基本結構和基本資料型別/4.4 變數/4.4.2 宣告和賦值語句結合

宣告和賦值語句結合 格式:var identifier [type] = value 這裡的type是可選的,具體的型別參照: 第4章:基本結構和基本資料型別/4.2 Go 程式的基本結構和要素/4.2.8 型別 顯式型別舉例: //整型 var a&nbs

Go語言基礎(七)—— Go語言for迴圈語句Go字串、Go語言函式

for迴圈 Go語言的For迴圈有3種形式,只有其中的一種使用分號,和C語言種的for一樣: for init; condition; post { } 和C語言種while一樣: for condition { } 說明: init: 一般為賦值表示式,給控制變數

分支語句/迴圈語句 | Go語言基礎

package main // 當前包宣告 func main() { // 程式的入口 // 分支語句/迴圈語句 // if // if 布林表示式{}else if 布林表示式{} else{} // switch // switch v{

go語言的迴圈語句for

一般來說,每種語言的迴圈語句都有兩三種,什麼for,foreach,while,do—until之類,應有盡有,總有一款適合您。但go是一款比較新的語言,語言的作者可能有一些自己的想法,迴圈語句就只提供了for一種。 suffixs := [6]string{".js",".css

Go語言無鎖佇列元件的實現 (chan/interface/select)

1. 背景 go程式碼中要實現非同步很簡單,go funcName()。 但是程序需要控制協程數量在合理範圍內,對應大批量任務可以使用“協程池 + 無鎖佇列”實現。 2. golang無鎖佇列實現思路 Channel是Go中的一個核心型別,你可以把它看成一個管道,通過它併發核心單元就可以傳送或者接

Go 語言的 Type Switch 語句解析

講述了Go語言中 Type Swith 的用法以及獲取對應變數的一些特殊情況。 Type Switch 的基本用法 Type Switch 是 Go 語言中一種特殊的 switch 語句,它比較的是型別而不是具體的值。它判斷某個介面變數的型別,然後根

帶你學夠浪:Go語言基礎系列 - 8分鐘學控制流語句

★ 文章每週持續更新,原創不易,「三連」讓更多人看到是對我最大的肯定。可以微信搜尋公眾號「 後端技術學堂 」第一時間閱讀(一般比部落格早更新一到兩篇) ” 對於一般的語言使用者來說 ,20% 的語言特性就能夠滿足 80% 的使用需求,剩下在使用中掌握。基於這一理論,Go 基礎系列的文章不會刻意追求面面俱到,

Go語言之嵌入類型

go 類型 嵌入類型,或者嵌套類型,這是一種可以把已有的類型聲明在新的類型裏的一種方式,這種功能對代碼復用非常重要。在其他語言中,有繼承可以做同樣的事情,但是在Go語言中,沒有繼承的概念。Go提倡的代碼復用的方式是組合,所以這也是嵌入類型的意義所在。組合而不是繼承,所以Go才會更靈活。type Rea