網站首頁 編程語言 正文
使用通道接收數據
在上一篇文章中介紹了通道以及使用通道發送數據,本篇接著了解通道的基本內容,如何使用通道接收數據;
通道的接收同樣使用"<-"操作符;
使用通道接收數據的特性如下:
- 通道的發送和接收操作在不同的兩個goroutine間進行,由于通道中的數據在沒有接收方接收時會持續阻塞,所以通道的接收必定在另外一個goroutine中進行;
- 如果在接收方接收時,通道中沒有發送方發送數據,則接收方也會發生阻塞,直到發送方發送消息為止;
- 通道一次只能接收一個元素數據;
通道的數據接收有四種寫法,接下來一一進行介紹
阻塞接收數據
阻塞模式在接收數據時,將接收變量作為"<-"操作符的左值,格式如下:
data := <-ch
執行該語句時將會阻塞,直到接收到數據并賦值給data變量
非阻塞接收數據
在使用非阻塞方式從通道接收數據時,語句不會發生阻塞,格式如下
data, ok := <-ch
data:接收到的數據,在未接收到數據時data為通道類型的零值
ok:是否接收到數據
非阻塞的通道接收方法,可能造成高的CPU占用,因此使用非常少,如果需要實現接收超時檢測,則需要配合select和計時器進行;
接收任意數據,忽略掉接收的數據
寫法如下:
<-ch
使用上面的這種寫法,會發生阻塞,直到接收到消息,但是通道在接收到數據后會將其忽略掉;這個方式實際上只是通過通道在goroutine間阻塞收發,從而實現并發同步;
使用通道做并發同步的示例如下圖所示:
循環接收數據
通道的數據接收可以借用for-range語句進行多個元素的接收操作,格式如下:
for data := range ch{ }
通道ch是可以被遍歷的,遍歷的結果就是接收到的數據,數據類型就是通道的數據類型,通過for遍歷獲得的變量只有一個,即上面例子中的data;
遍歷通道數據的示例如下圖所示:
通道可以在兩個goroutine之間通過傳遞一個指定類型的值來同步運行和通訊,操作符"<-"用于指定通道的方向、發送和接收,如果未指定方向,則為雙向通道;
ch <- v ? ? ? 把v發送到通道ch中
v := <-ch ? ? 從ch接收數據,并把值賦給v
下面列舉一個示例通過兩個goroutine計算數字之和,如下圖所示:
原文鏈接:https://juejin.cn/post/7134496246223355935
相關推薦
- 2022-07-12 eureka更換為nacos
- 2022-04-25 C#使用NPOI設置Excel下拉選項_C#教程
- 2022-04-23 uniapp用Promise封裝get和post請求
- 2022-03-14 寶塔中nginx配置websocket的wss協議
- 2022-12-08 React狀態更新的優先級機制源碼解析_React
- 2022-04-02 IDEA集成Docker實現打包的方法_docker
- 2022-08-23 C++深入探究友元使用_C 語言
- 2022-03-25 C語言設計模式之命令模式介紹_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支