Go 語言中的select是做什么的

Go 語言中的 select 是做什么的

在 Go 語言中,select 語句是用于處理多個通道(channel)操作的一種控制結構。它類似于 switch 語句,但專門用于并發編程,允許 Goroutine 在多個通道上等待操作(發送或接收),并在某個通道就緒時執行對應的分支。select 是 Go 并發模型中的核心特性之一,與通道和 Goroutine 緊密相關。


基本功能

select 的主要作用是:

  1. 多路復用通道:同時監聽多個通道的讀寫操作。
  2. 非阻塞選擇:當多個通道中有任意一個就緒時,執行對應的邏輯;如果沒有通道就緒,可以執行默認分支(如果有)。
  3. 并發協調:幫助 Goroutine 在不同的通信場景中協調行為。

語法

select {
case <-channel1:// 從 channel1 接收數據時的處理邏輯
case channel2 <- value:// 向 channel2 發送數據時的處理邏輯
case v := <-channel3:// 從 channel3 接收數據并賦值給 v 的處理邏輯
default:// 所有通道都未就緒時的默認邏輯(可選)
}
  • 每個 case 表示一個通道操作(發送或接收)。
  • default 是可選的,表示當所有通道都未就緒時執行的邏輯。

工作原理

  1. 等待通道就緒

    • select 會阻塞當前 Goroutine,直到某個 case 中的通道操作可以執行。
    • 如果多個通道同時就緒,select 會隨機選擇一個 case 執行(避免饑餓問題)。
  2. 非阻塞行為

    • 如果提供了 default 分支,且沒有通道就緒,select 會立即執行 default 而不會阻塞。
  3. 空 select

    • 如果 select 中沒有 case,會永久阻塞(類似于 for {})。

示例

示例 1:監聽多個通道

package mainimport ("fmt""time"
)func main() {ch1 := make(chan string)ch2 := make(chan string)go func() {time.Sleep(1 * time.Second)ch1 <- "from ch1"}()go func() {time.Sleep(2 * time.Second)ch2 <- "from ch2"}()select {case msg1 := <-ch1:fmt.Println("Received:", msg1)case msg2 := <-ch2:fmt.Println("Received:", msg2)}
}
  • 輸出Received: from ch1
  • 說明ch1 在 1 秒后就緒,比 ch2(2 秒)快,因此執行 ch1 的分支。

示例 2:帶默認分支

package mainimport ("fmt"
)func main() {ch := make(chan string)select {case msg := <-ch:fmt.Println("Received:", msg)default:fmt.Println("No message received")}
}
  • 輸出No message received
  • 說明:由于 ch 沒有數據就緒,select 執行 default 分支。

示例 3:發送和接收結合

package mainimport ("fmt""time"
)func main() {ch1 := make(chan string, 1)ch2 := make(chan string, 1)select {case ch1 <- "to ch1":fmt.Println("Sent to ch1")case msg := <-ch2:fmt.Println("Received from ch2:", msg)default:fmt.Println("Nothing happened")}
}
  • 輸出Sent to ch1
  • 說明ch1 是緩沖通道,可以立即發送成功,因此執行發送分支。

示例 4:超時控制

package mainimport ("fmt""time"
)func main() {ch := make(chan string)select {case msg := <-ch:fmt.Println("Received:", msg)case <-time.After(2 * time.Second):fmt.Println("Timeout after 2 seconds")}
}
  • 輸出Timeout after 2 seconds
  • 說明time.After 創建一個定時器通道,2 秒后就緒,模擬超時邏輯。

常見用途

  1. 多路復用

    • 在多個通道之間選擇就緒的通道,避免逐一輪詢。
  2. 超時處理

    • 使用 time.After 實現操作超時。
  3. 非阻塞檢查

    • 通過 default 分支檢查通道是否就緒。
  4. 協調 Goroutine

    • 在并發任務中,根據通道狀態決定下一步操作。

注意事項

  1. 隨機選擇

    • 當多個 case 同時就緒時,select 隨機選擇一個執行,而不是按順序。
  2. 阻塞性

    • 沒有 default 時,select 會阻塞直到某個通道就緒。
  3. 空 select

    select {}
    
    • 這會永久阻塞,通常用于主 Goroutine 等待。
  4. 通道關閉

    • 如果某個通道已關閉,接收操作會立即返回零值,可能需要額外的邏輯判斷。

總結

  • 是什么select 是 Go 中用于處理多通道操作的并發控制語句。
  • 做什么:監聽多個通道,選擇就緒的通道執行對應邏輯,支持超時和非阻塞操作。
  • 為什么用:簡化并發編程,提高代碼效率和可讀性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76411.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智慧班牌系統解決方案,SaaS智慧電子班牌云平臺

智慧班牌系統解決方案 系統概述 智慧班牌是智慧校園建設不斷發展的產物&#xff0c;是教育信息化改革的載體。通過智慧班牌可以高效便捷傳遞各種知識信息和通知信息、及時反饋課堂信息、實現班級的透明化管理。智慧班牌將學生平安考勤、異常出勤情況及時反饋至家長、老師&…

利用大模型和聚類算法找出 Excel 文件中重復或相似度高的數據,并使用 FastAPI 進行封裝的詳細方案

以下是一個利用大模型和聚類算法找出 Excel 文件中重復或相似度高的數據,并使用 FastAPI 進行封裝的詳細方案: 方案流程 數據讀取:從 Excel 文件中讀取數據。文本向量化:使用大模型將文本數據轉換為向量表示。聚類分析:運用聚類算法對向量進行分組,將相似度高的數據歸為…

【Docker基礎】容器技術詳解:生命周期、命令與實戰案例

文章目錄 一、什么是容器&#xff1f;二、為什么需要容器三、容器的生命周期容器狀態容器OOM容器異常退出容器異常退出容器暫停 四、容器命令命令清單詳細介紹 五、容器操作案例容器的狀態遷移容器批量操作容器交互模式attached 模式detached 模式interactive 模式 容器 與 宿主…

Laravel 實現 隊列 發送郵件功能

一. 什么是隊列 在構建 Web 應用程序時&#xff0c;你可能需要執行一些任務&#xff0c;例如解析文件&#xff0c;發送郵件&#xff0c;大量的數據計算等等&#xff0c;這些任務在典型的 Web 請求期間需要很長時間才能執行。 慶幸的是&#xff0c;Laravel 可以創建在后臺運行…

flink Shuffle的總結

關于 ** ?5 種 Shuffle 類型** 的區別、使用場景及 Flink 版本支持的總結&#xff1a; * 注意:下面是問AI具體細節與整理學習 1. 核心區別 Shuffle 類型核心特點使用場景Flink 版本支持Pipelined Shuffle流式調度&#xff0c;純內存交換&#xff0c;低延遲&#xff08;毫秒級…

Git使用與管理

一.基本操作 1.創建本地倉庫 在對應文件目錄下進行&#xff1a; git init 輸入完上面的代碼&#xff0c;所在文件目錄下就會多一個名為 .git 的隱藏文件&#xff0c;該文件是Git用來跟蹤和管理倉庫的。 我們可以使用 tree 命令&#xff08;注意要先下載tree插件&#xff09…

計算機視覺——深度學習圖像處理中目標檢測平均精度均值(mAP)與其他常用評估指標

概述 平均精度均值&#xff08;mAP&#xff09;是目標檢測領域中最為流行且復雜的重要評估指標之一。它廣泛用于綜合總結目標檢測器的性能。許多目標檢測模型會輸出類似以下的參數結果&#xff1a; Average Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.3…

C語言中單鏈表操作:查找節點與刪除節點

一. 簡介 前面學習了C語言中創建鏈表節點&#xff0c;向鏈表中插入節點等操作&#xff0c;文章如下&#xff1a; C語言中單向鏈表&#xff1a;創建節點與插入新節點-CSDN博客 本文繼續學習c語言中對鏈表的其他操作&#xff0c;例如在鏈表中查找某個節點&#xff0c;刪除鏈表…

WePY 框架:小程序開發的“Vue式”利器!!!

WePY 框架&#xff1a;小程序開發的“Vue式”利器 &#x1f680; 哈嘍&#xff0c;大家好&#xff01;&#x1f44b; 今天我們要聊聊一個在微信小程序開發中大放異彩的框架——WePY&#xff01;它是什么&#xff1f;有什么特點&#xff1f;為啥值得一試&#xff1f;別急&#…

什么是微前端?有什么好處?有哪一些方案?

微前端&#xff08;Micro Frontends&#xff09; 微前端是一種架構理念&#xff0c;借鑒了微服務的思想&#xff0c;將一個大型的前端應用拆分為多個獨立、自治的子應用&#xff0c;每個子應用可以由不同團隊、使用不同技術棧獨立開發和部署&#xff0c;最終聚合為一個整體產品…

【家政平臺開發(33)】庫存管理模塊開發實戰:從基礎搭建到智能管控

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質量,…

Mysql個人筆記

Mysql個人筆記 sql基礎書寫規則和種類種類書寫規則注釋規則啟動 DDL數據類型數據庫的操作useshowcreatedrop 表的操作useshowcreate創建表復制表 dropalter Mysql的存儲引擎 DMLselectselect語句like&#xff08;謂詞&#xff09;where聚合函數&#xff1a;關于nullgroup byexi…

【重裝系統】大白菜自制U盤裝機,備份C盤數據,解決電腦啟動黑屏/藍屏

1. 準備 U 盤 U 盤容量至少 8G&#xff0c;備份 U 盤的數據&#xff08;后期會格式化&#xff09; 2. 從微軟官網下載操作系統鏡像 https://www.microsoft.com/zh-cn/software-download/windows11 3. 下載安裝大白菜 https://www.alipan.com/s/33RVnKayUfY 4. 插入 U 盤&#…

各類神經網絡學習:(十)注意力機制(第2/4集),pytorch 中的多維注意力機制、自注意力機制、掩碼自注意力機制、多頭注意力機制

上一篇下一篇注意力機制&#xff08;第1/4集&#xff09;待編寫 一、pytorch 中的多維注意力機制&#xff1a; 在 N L P NLP NLP 領域內&#xff0c;上述三個參數都是 向量 &#xff0c; 在 p y t o r c h pytorch pytorch 中參數向量會組成 矩陣 &#xff0c;方便代碼編寫。…

uni-app初學

文章目錄 1. pages.json 頁面路由2. 圖標3. 全局 CSS4. 首頁4.1 整體框架4.2 完整代碼4.3 輪播圖 swiper4.3.1 image 4.4 公告4.4.1 uni-icons 4.5 分類 uni-row、uni-col4.6 商品列表 小程序開發網址&#xff1a; 注冊小程序賬號 微信開發者工具下載 uniapp 官網 HbuilderX 下…

VBA將Word文檔內容逐行寫入Excel

如果你需要將Word文檔的內容導入Excel工作表來進行數據加工&#xff0c;使用下面的代碼可以實現&#xff1a; Sub ImportWordToExcel()Dim wordApp As Word.ApplicationDim wordDoc As Word.DocumentDim excelSheet As WorksheetDim filePath As VariantDim i As LongDim para…

MySQL運行一段時間后磁盤出現100%讀寫

MySQL運行一段時間后磁盤出現100%讀寫的情況&#xff0c;可能是由多種原因導致的&#xff0c;以下是一些常見原因及解決方法&#xff1a; 可能的原因 1. 磁盤I/O壓力過大[^0^]&#xff1a;數據量過大&#xff0c;數據庫查詢和寫入操作消耗大量I/O資源。索引效率低&#xff0c…

【RabbitMQ】延遲隊列

1.概述 延遲隊列其實就是隊列里的消息是希望在指定時間到了以后或之前取出和處理&#xff0c;簡單來說&#xff0c;延時隊列就是用來存放需要在指定時間被處理的元素的隊列。 延時隊列的使用場景&#xff1a; 1.訂單在十分鐘之內未支付則自動取消 2.新創建的店鋪&#xff0c;…

Linux筆記之Ubuntu系統設置自動登錄tty1界面

Ubuntu22.04系統 編輯getty配置文件 vim /etc/systemd/system/gettytty1.service.d/override.conf如果該目錄或者文件不存在&#xff0c;進行創建。 在override.conf文件中進行編輯&#xff1a; [Service] ExecStart ExecStart-/sbin/agetty --autologin yourusername --no…

C++程序詩篇的靈動賦形:多態

文章目錄 1.什么是多態&#xff1f;2.多態的語法實現2.1 虛函數2.2 多態的構成2.3 虛函數的重寫2.3.1 協變2.3.2 析構函數的重寫 2.4 override 和 final 3.抽象類4.多態原理4.1 虛函數表4.2 多態原理實現4.3 動態綁定與靜態綁定 5.繼承和多態常見的面試問題希望讀者們多多三連支…