



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Go通道channel通過通信共享內存目錄引言通道的聲明與創建接收發送數據
引言
不要通過共享內存來通信應該通過通信來共享內存
這句話有網友的解釋如下:
這句俏皮話具體說來就是,不同的線程不共享內存不用鎖,線程之間通訊用通道(channel)同步也用channel。
chanel是協程之間傳遞信息的媒介,優雅地解決了某些后端開發常用語言中隨處可見的lock,unlock,臨界區等,把從很多線程層面解決的問題移到協程,從而靜態地保證沒有數據競爭。
通道的聲明與創建
偽代碼如下:
//聲明類型
var通道名chan數據類型
//創建通道
通道名=make(chan數據類型)
實際例子如下:
packagemain
import"fmt"
funcmain(){
varachanint
fmt.Printf("%T,%v\n",a,a)
ifa==nil{
a=make(chanint)
fmt.Printf("%T,%v\n",a,a)
}
運行結果是:
chanint,nil
chanint,0x1400001a360
通道是一個內存地址,這也說明了其實一個引用類型的數據。
接收發送數據
對于同一個通道來講,他的讀數據和寫數據都是阻塞的。
偽代碼如下:
//從通道讀數據
data:=-a
//把數據寫入通道
a-data
實際例子如下:
packagemain
import"fmt"
funcmain(){
//首先創建一個bool類型的通道
varch1chanbool
ch1=make(chanbool)
//下面啟動一個goroutine
gofunc(){
fori:=0;i10;i++{
fmt.Println("子goroutine中,i:",i)
fmt.Println("completed")
//循環結束后向團隊中寫數據,表示要結束了
ch1-true
//在主程序中讀取數據
data:=-ch1
//打印一下我們讀到的數據
fmt.Println("maindata:",data)
fmt.Println("maingoroutinecompleted")
}
運行結果如下:
子goroutine中,i:0
子goroutine中,i:1
子goroutine中,i:2
子goroutine中,i:3
子goroutine中,i:4
子goroutine中,i:5
子goroutine中,i:6
子goroutine中,i:7
子goroutine中,i:8
子goroutine中,i:9
completed
maindata:true
maingoroutinecompleted
我們的子goroutine里面循環打印1~10,打印完成之后把chanel類型的ch1寫為true,
這時候,主goroutine就可以根據這一條件進行下一步了,,在此之前,其實就算主goroutine先搶到了資源,從ch1中讀取數據,但是現在通道里面啥都沒有,只能阻塞,然后乖乖交出資源給我們的子goroutine,直到循環結束寫true入ch1。
需要注意的有以下幾點:
chanel是需要指定類型的nil類型的chanel不能直接使用。chanel本身是同步的,同一時間只能有一條goroutine進行操作。chanel是goroutine之間傳遞數據用的,chanel數據的發送和接收必須在不同的goroutine中,如果只有一條goroutine是用不上chanel的,這種情況會發生死鎖(deadLock)。從chanel里面讀數據立馬就會被阻塞,直到有向chanel寫數據的goroutine來。向chanel里面寫數據立馬就會被阻塞,直到有從chanel讀數據的goroutine來。
(以上都是相對于沒有緩存的通道而
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 森林生態補償與林權流轉合作協議
- 網絡影視作品版權代理合作協議
- 綠色建筑電氣系統設計、安裝及性能驗收協議
- 重型工業儀器定期校準認證與風險評估合同
- 生物制藥潔凈廠房空氣凈化系統租賃與安全檢測合同
- 航空貨運代理航空貨物清關代理承包協議
- 海外留學行李保險與全球托運質量監管協議
- 《社會保險知識普及教學課件》
- 《慢性腎衰竭》課件2
- 《農業機械操作培訓》課件
- 有限空間作業氣體檢測記錄表
- 出貨檢驗報告
- 高分子材料完整版課件
- DB37∕T 5118-2018 市政工程資料管理標準
- 無機材料科學基礎-第3章-晶體結構與晶體中的缺陷
- 油水井管理及動態分析.
- 水稻脫粒機畢業設計畢業設計
- 完整版電力工程設計資質分級標準
- 硬筆書法練習用紙A4打印模板
- 中國民用航空通信導航監視系統運行、維護規程
- 5000噸干貨船設計總體方案及第三部分
評論
0/150
提交評論