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

Go中select行為規(guī)則和執(zhí)行順序的實(shí)現(xiàn)

 更新時間:2026年02月05日 09:54:53   作者:Kevin666  
Go語言中的select語句用于在多個通信操作中進(jìn)行選擇,本文就來詳細(xì)的介紹一下Go中select行為規(guī)則和執(zhí)行順序的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下

Go 語言中 select 語句的行為規(guī)則和執(zhí)行順序。

? 規(guī)則1:每個case表達(dá)式必須有發(fā)送或接收操作,可能還有其他表達(dá)式

含義:

每個 case 至少要有一個通道操作(<-chan 或 chan<-),可以搭配賦值、函數(shù)調(diào)用等。

示例:

ch := make(chan int, 1)

select {
case x := <-ch: // 接收操作 + 賦值
	fmt.Println("Received:", x)
}
select {
case ch <- computeValue(): // 發(fā)送操作 + 函數(shù)調(diào)用
	fmt.Println("Sent")
}

? 規(guī)則2:表達(dá)式求值順序是從上到下,從左到右

含義:

所有 case 分支中的表達(dá)式,在 select 執(zhí)行之初就按書寫順序全部求值。表達(dá)式多于一個時,按從左到右順序求值。

示例:

ch1 := make(chan int)
ch2 := make(chan int)

select {
case x := <-ch1:
	fmt.Println("ch1", x)
case y := <-ch2:
	fmt.Println("ch2", y)
}

上面例子中:

  1. ch1 的接收表達(dá)式會先被求值;
  2. 然后 ch2;
  3. 然后再看哪個能成功進(jìn)行選擇。

? 規(guī)則3:如果通道操作阻塞,case 就不滿足條件

含義:

當(dāng)某個 case 執(zhí)行通道操作時,如果它會阻塞(比如通道沒數(shù)據(jù),或者通道滿) ,它就不能被選中。

示例:

ch := make(chan int)

select {
case ch <- 1: // 沒有接收方,發(fā)送會阻塞
	fmt.Println("sent")
default:
	fmt.Println("default")
}

輸出:

default

? 規(guī)則4:只有所有 case 表達(dá)式求值完后,select 才選分支

含義:

select 要先靜態(tài)地評估所有分支是否能執(zhí)行,然后才在滿足條件的分支中挑選一個。

示例:

ch := make(chan int, 1)
ch <- 42

select {
case x := <-ch: // 可執(zhí)行
	fmt.Println("got", x)
case y := <-ch: // 不可執(zhí)行(通道空了)
	fmt.Println("got", y)
}

輸出:

got 42

? 規(guī)則5:多個可選分支時,select 隨機(jī)選一個

含義:

多個分支都可執(zhí)行時,select 不會按照書寫順序選第一個,而是隨機(jī)選一個。

示例:

ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
ch1 <- 1
ch2 <- 2

select {
case x := <-ch1:
	fmt.Println("ch1", x)
case y := <-ch2:
	fmt.Println("ch2", y)
}

輸出可能是:

ch1 1

或者

ch2 2

? 規(guī)則6:default分支最多只能有一個,并且只在無其他可選時執(zhí)行

含義:

  • default 分支不能有多個;
  • 它只有在所有 case 都阻塞時才會被執(zhí)行;
  • 不管你把它寫在最上面還是最下面,它只有在“無可選分支”時才會被選中。

示例:

ch := make(chan int)

select {
default:
	fmt.Println("default executed")
case <-ch:
	fmt.Println("received")
}

輸出:

default executed

小結(jié)

場景描述是否滿足選擇條件
通道有數(shù)據(jù)可讀(接收操作)?
通道有空位可寫(發(fā)送操作)?
通道阻塞(接收或發(fā)送都不能繼續(xù))?
所有 case 都阻塞 + 有 default選中 default
所有 case 都阻塞 + 無 defaultselect 阻塞
多個 case 都滿足條件隨機(jī)選一個

到此這篇關(guān)于Go中select行為規(guī)則和執(zhí)行順序的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Go select行為規(guī)則和執(zhí)行順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言實(shí)戰(zhàn)之實(shí)現(xiàn)一個簡單分布式系統(tǒng)

    Go語言實(shí)戰(zhàn)之實(shí)現(xiàn)一個簡單分布式系統(tǒng)

    如今很多云原生系統(tǒng)、分布式系統(tǒng),例如?Kubernetes,都是用?Go?語言寫的,這是因?yàn)?Go?語言天然支持異步編程。本篇文章將介紹如何用?Go?語言編寫一個簡單的分布式系統(tǒng),需要的小伙伴開業(yè)跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • Go?defer?去掉閉包函數(shù)及用法分析

    Go?defer?去掉閉包函數(shù)及用法分析

    這篇文章主要為大家介紹了Go?defer?去掉閉包函數(shù)及用法分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • golang判斷兩個事件是否存在沖突的方法示例

    golang判斷兩個事件是否存在沖突的方法示例

    這篇文章主要為大家詳細(xì)介紹了golang判斷兩個事件是否存在沖突的方法示例,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Go語言學(xué)習(xí)之條件語句使用詳解

    Go語言學(xué)習(xí)之條件語句使用詳解

    這篇文章主要介紹了Go語言中條件語句的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Go語言泛型使用及說明

    Go語言泛型使用及說明

    這篇文章主要介紹了Go語言泛型使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-01-01
  • 淺析Golang中make和new的用法區(qū)別

    淺析Golang中make和new的用法區(qū)別

    在Go語言中,有兩個比較雷同的內(nèi)置函數(shù),分別是new和make方法,二者都可以用來分配內(nèi)存,那他們有什么區(qū)別呢?下面就跟隨小編一起來學(xué)習(xí)一下吧
    2024-02-02
  • Go語言中常見的文件操作分享

    Go語言中常見的文件操作分享

    文件操作應(yīng)該是應(yīng)用程序里非常常見的一種操作,無論是哪種應(yīng)用場景,幾乎都離不開文件的基本操作。Go語言中提供了三個不同的包去處理文件,下午就來說說它們的具體使用
    2023-01-01
  • golang解析域名的步驟全紀(jì)錄

    golang解析域名的步驟全紀(jì)錄

    這篇文章主要給大家介紹了利用golang如何解析域名的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Golang?鎖原理的簡單實(shí)現(xiàn)

    Golang?鎖原理的簡單實(shí)現(xiàn)

    本文主要介紹了Golang?鎖原理的簡單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go實(shí)現(xiàn)HTTP請求轉(zhuǎn)發(fā)的示例代碼

    Go實(shí)現(xiàn)HTTP請求轉(zhuǎn)發(fā)的示例代碼

    請求轉(zhuǎn)發(fā)是一項(xiàng)核心且常見的功能,本文主要介紹了Go實(shí)現(xiàn)HTTP請求轉(zhuǎn)發(fā)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05

最新評論

泽普县| 常德市| 平果县| 永清县| 隆安县| 华容县| 建昌县| 关岭| 拉萨市| 威信县| 东安县| 开原市| 泾源县| 龙泉市| 手机| 喀喇| 淮南市| 正蓝旗| 麻栗坡县| 集安市| 翁牛特旗| 郑州市| 甘肃省| 城步| 延长县| 寿阳县| 柳河县| 伊通| 黔江区| 会泽县| 房产| 沙田区| 桐庐县| 五大连池市| 富平县| 镇原县| 连平县| 平谷区| 屏山县| 定安县| 井研县|