亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go中select多路復(fù)用的實(shí)現(xiàn)示例

 更新時(shí)間:2025年08月14日 11:20:42   作者:程序員愛(ài)釣魚(yú)  
Go的select用于多通道通信,實(shí)現(xiàn)多路復(fù)用,支持隨機(jī)選擇、超時(shí)控制及非阻塞操作,建議合理使用以避免協(xié)程泄漏和死循環(huán),感興趣的可以了解一下

select 是 Go 并發(fā)編程中非常強(qiáng)大的語(yǔ)法結(jié)構(gòu),它允許程序同時(shí)等待多個(gè)通道操作的完成,從而實(shí)現(xiàn)多路復(fù)用機(jī)制,是協(xié)程調(diào)度、超時(shí)控制、通道競(jìng)爭(zhēng)等場(chǎng)景的核心工具。

一、什么是select

select 類(lèi)似于 switch 語(yǔ)句,但它用于監(jiān)聽(tīng)多個(gè)通道的發(fā)送/接收操作。一旦其中任意一個(gè)通道準(zhǔn)備就緒,select 就會(huì)執(zhí)行相應(yīng)的語(yǔ)句塊。

基本語(yǔ)法:

select {
case val := <-ch1:
    // ch1 可讀時(shí)執(zhí)行
case ch2 <- data:
    // ch2 可寫(xiě)時(shí)執(zhí)行
default:
    // 所有通道都不準(zhǔn)備好時(shí)執(zhí)行(可選)
}

二、select 使用示例

示例1:監(jiān)聽(tīng)多個(gè)通道輸入

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        time.Sleep(1 * time.Second)
        ch1 <- "消息來(lái)自 ch1"
    }()

    go func() {
        time.Sleep(2 * time.Second)
        ch2 <- "消息來(lái)自 ch2"
    }()

    select {
    case msg1 := <-ch1:
        fmt.Println(msg1)
    case msg2 := <-ch2:
        fmt.Println(msg2)
    }
}

輸出(大概率):

消息來(lái)自 ch1

誰(shuí)先準(zhǔn)備好,誰(shuí)被執(zhí)行。

三、select的特性

  • 隨機(jī)選擇:如果多個(gè) case 同時(shí)滿(mǎn)足,Go 會(huì)隨機(jī)選擇一個(gè)執(zhí)行,避免饑餓。
  • 阻塞行為:當(dāng)沒(méi)有任何 case 可以運(yùn)行時(shí),select 會(huì)阻塞,除非有 default。
  • 可配合 for 使用:實(shí)現(xiàn)多路輪詢(xún)、協(xié)程調(diào)度等高級(jí)用法。

四、使用select實(shí)現(xiàn)超時(shí)機(jī)制

select 搭配 time.After() 可實(shí)現(xiàn)通道的超時(shí)控制:

select {
case msg := <-ch:
    fmt.Println("收到消息:", msg)
case <-time.After(2 * time.Second):
    fmt.Println("超時(shí)未收到")
}

實(shí)用場(chǎng)景:

  • 網(wǎng)絡(luò)請(qǐng)求超時(shí)
  • 等待任務(wù)執(zhí)行完成
  • 控制并發(fā)阻塞時(shí)間

五、非阻塞通信:使用default

select {
case msg := <-ch:
    fmt.Println("收到:", msg)
default:
    fmt.Println("沒(méi)有收到任何數(shù)據(jù)")
}

不等待,立即返回默認(rèn)分支。

六、監(jiān)聽(tīng)通道關(guān)閉

配合 range 和 select,可以?xún)?yōu)雅處理通道關(guān)閉:

for {
    select {
    case msg, ok := <-ch:
        if !ok {
            fmt.Println("通道已關(guān)閉")
            return
        }
        fmt.Println("收到:", msg)
    }
}

七、實(shí)踐:合并多個(gè)輸入通道

func merge(ch1, ch2 <-chan string) <-chan string {
    out := make(chan string)
    go func() {
        for {
            select {
            case msg := <-ch1:
                out <- msg
            case msg := <-ch2:
                out <- msg
            }
        }
    }()
    return out
}

? 實(shí)現(xiàn)“扇入”(fan-in)模式,將多個(gè)輸入流合并成一個(gè)輸出。

八、小結(jié)

功能是否支持
同時(shí)監(jiān)聽(tīng)多個(gè)通道?
隨機(jī)選擇就緒的通道執(zhí)行?
支持默認(rèn)分支防止阻塞?
可實(shí)現(xiàn)超時(shí)控制與輪詢(xún)?
實(shí)現(xiàn)非阻塞收發(fā)或關(guān)閉判斷?

實(shí)戰(zhàn)建議

  • 為所有關(guān)鍵的通道通信加上 select 和超時(shí)控制,避免協(xié)程泄漏。
  • 避免使用 select 輪詢(xún)空通道導(dǎo)致死循環(huán)。
  • 多通道合并、拆分時(shí),配合 select 和 sync.WaitGroup 效果更佳。

到此這篇關(guān)于Go中select多路復(fù)用的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go select多路復(fù)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Go語(yǔ)言實(shí)現(xiàn)可選參數(shù)的方法小結(jié)

    Go語(yǔ)言實(shí)現(xiàn)可選參數(shù)的方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)可選參數(shù)的一些常見(jiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 特殊字符的json序列化總結(jié)大全

    特殊字符的json序列化總結(jié)大全

    這篇文章主要給大家介紹了關(guān)于特殊字符的json序列化的相關(guān)資料,通過(guò)示例代碼分別給大家介紹了關(guān)于python 、 rust 、 java 和golang對(duì)特殊字符的json序列化操作,需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 詳解Golang中string的實(shí)現(xiàn)原理與高效使用

    詳解Golang中string的實(shí)現(xiàn)原理與高效使用

    在Go語(yǔ)言中,無(wú)論是字符串常量、字符串變量還是代碼中出現(xiàn)的字符串字面量,它們的類(lèi)型都被統(tǒng)一設(shè)置為string,下面就跟隨小編一起來(lái)了解一下Golang中string的實(shí)現(xiàn)原理與高效使用吧
    2024-01-01
  • golang 實(shí)現(xiàn)tcp轉(zhuǎn)發(fā)代理的方法

    golang 實(shí)現(xiàn)tcp轉(zhuǎn)發(fā)代理的方法

    今天小編就為大家分享一篇golang 實(shí)現(xiàn)tcp轉(zhuǎn)發(fā)代理的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Go語(yǔ)言學(xué)習(xí)之結(jié)構(gòu)體和方法使用詳解

    Go語(yǔ)言學(xué)習(xí)之結(jié)構(gòu)體和方法使用詳解

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中結(jié)構(gòu)體和方法的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2022-04-04
  • 一文帶你全面掌握Go語(yǔ)言中的正則表達(dá)式

    一文帶你全面掌握Go語(yǔ)言中的正則表達(dá)式

    正則表達(dá)式是一種強(qiáng)大的模式匹配工具,能夠在文本中進(jìn)行靈活的搜索和替換操作,本文將介紹?Golang?中的正則表達(dá)式語(yǔ)法,包括常用的匹配符號(hào)、模式修飾符以及示例應(yīng)用,希望對(duì)大家有所幫助
    2023-05-05
  • Go語(yǔ)言二進(jìn)制文件的讀寫(xiě)操作

    Go語(yǔ)言二進(jìn)制文件的讀寫(xiě)操作

    本文主要介紹了Go語(yǔ)言二進(jìn)制文件的讀寫(xiě)操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Golang處理parquet文件實(shí)戰(zhàn)指南

    Golang處理parquet文件實(shí)戰(zhàn)指南

    這篇文章主要給大家介紹了關(guān)于Golang處理parquet文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Go語(yǔ)言開(kāi)發(fā)技巧必知的小細(xì)節(jié)提升效率

    Go語(yǔ)言開(kāi)發(fā)技巧必知的小細(xì)節(jié)提升效率

    這篇文章主要介紹了Go語(yǔ)言開(kāi)發(fā)技巧必知的小細(xì)節(jié)提升效率,分享幾個(gè)你可能不知道的Go語(yǔ)言小細(xì)節(jié),希望能幫助大家更好地學(xué)習(xí)這門(mén)語(yǔ)言
    2024-01-01
  • Go語(yǔ)言Slice切片底層的實(shí)現(xiàn)

    Go語(yǔ)言Slice切片底層的實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言Slice切片底層的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04

最新評(píng)論