Golang channle(管道)基本介紹、快速入門

channel(管道)-基本介紹


為什么需要channel?前面使用全局變量加鎖同步來解決goroutine的通訊,但不完美

1)主線程在等待所有goroutine全部完成的時間很難確定,我們這里設置10秒,僅僅是估算。
2)如果主線程休眠時間長了,會加長等待時間,如果等待時間短了,可能還有goroutine處于工作狀態,這時也會隨主線程的退出而銷毀
3)通過全局變量加鎖同步來實現通訊,也并不利用多個協程對全局變量的讀寫操作。
4)上面種種分析都在呼喚一個新的通訊機制-channel

package mainimport ("fmt""sync""time"
)var (m = make(map[int]int, 10)//聲明一個全局的互斥鎖  lock是一個全局的互斥鎖//sync是包 同步的意思 mutex是互斥的意思lock sync.Mutex
)// test函數就是計算n的階乘
func test(n int) {res := 1for i := 1; i <= n; i++ {res = res * i}//將計算結果放到map當中 加鎖lock.Lock()m[n] = reslock.Unlock()
}func main() {//這里開啟多協程完成任務for i := 1; i <= 20; i++ {go test(i)}time.Sleep(time.Second * 10)for k, v := range m {fmt.Println(k, v)}
}


?

channel的介紹


1)channle本質就是一個數據結構-隊列【示意圖】
2)數據是先進先出
3)線程安全,多goroutine訪問時,不需要加鎖,就是說channel本身就是線程安全的(管道是線程安全的,你在對管道讀取的時候不管有多少個協程在對同一個管道操作,可以放心使用,不會出現錯誤,這些是有編譯器在底層維護的)
4)channel時有類型的,一個string的channel只能存放string類型數據。(如果管道想放int或者float那么可以使用空接口interface類型)
?

定義/聲明channel


var變量名chan敞據類型

舉例:

var intChan chan int (intChan用于存放int數據)
var mapChan chan map[int]string  (mapChan用于存放map[int]string類型)
var perChan chan Person
var perChan2 chan *Person

說明:

1)channel是引用類型

2)channel必須初始化才能寫入數據,即make后才能使用

3)管道是有類型的,intChan只能寫入整數int

channel初始化


說明:使用make進行初始化

var intChan chan int
intChan =make(chan int,10)

向channel中寫入(存放)數據

var intChan chan int
intChan =make(chan int,10)
num =999
intChan<-10
intChan<-num

如果將channel傳給另外一個函數,那么在這個函數里面操作的是同一個管道,因為它是引用類型。

package mainimport "fmt"func main() {var intChan chan int//創建可以存放3個int類型的管道intChan = make(chan int, 3)//看看intChan是什么fmt.Printf("initChan的值為=%v\ninitChan本身地址為%p\n", intChan, &intChan)//向管道寫入數據intChan <- 1num := 2intChan <- num//當給管道寫入數據的時候,不能超過其容量//看看管道的長度和capfmt.Println("長度:", len(intChan), "容量:", cap(intChan))num1 := <-intChanfmt.Println("取出來的第一個數據是:", num1)fmt.Println("取出之后的長度:", len(intChan), "取出之后的容量:", cap(intChan))//在沒有使用協程的情況下,如果我們的管道數據已經全部取出,再取就會報告deadlock
}initChan的值為=0xc00007a080
initChan本身地址為0xc00000a028
長度: 2 容量: 3                    
取出來的第一個數據是: 1            
取出之后的長度: 1 取出之后的容量: 3

?

?

?

?channel使用注意事項


1.channel中只能存放指定的數據類型

2.channle的數據放滿后,就不能再放入了(會出現死鎖的錯誤)

3.如果從channel取出數據后,可以繼續放入

4.在沒有使用協程的情況下,如果channel數據取完了,再取,就會報dead lock

?管道里面可以存放很多map,每個map里面又可以有多對的key/value。這里在使用map之前要先make一把。

?管道也是可以存放結構體實例的。

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

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

相關文章

【計算機網絡】HTTP響應報文Cookie原理

目錄 HTTP響應報文格式 一. 狀態行 狀態碼與狀態碼描述 二. 響應頭 Cookie原理 一. 前因 二. Cookie的狀態管理 結束語 HTTP響應報文格式 HTTP響應報文分為四部分 狀態行&#xff1a;包含三部分&#xff1a;協議版本&#xff0c;狀態碼&#xff0c;狀態碼描述響應頭&a…

如何選擇LED天幕屏的型號

隨著LED屏幕技術的不斷成熟&#xff0c;其應用范圍也日益擴大&#xff0c;從傳統的墻面固定安裝&#xff0c;到落地式、租賃移動式&#xff0c;再到LED互動地磚屏和安裝在天花板上的LED天幕屏等&#xff0c;安裝方式多種多樣。那么&#xff0c;在面對如此多元化的選擇時&#x…

PHP基礎 - 類型比較

在 PHP 中,作為一種弱類型語言,它提供了松散比較和嚴格比較兩種方式來比較變量的值和類型。 松散比較: 使用兩個等號(==)進行比較,只會比較變量的值,而不會考慮它們的數據類型。例如: $a = 5; // 整數 $b = 5; // 字符串if ($a == $b) {echo "相等"; // 輸…

C/C++ 編程規范總結

目錄 前言 一、編程規范的作用 二、規范的三種形式 三、規范的內容 1. 基本原則 原則1-1 原則1-2 原則1-3 原則1-4 原則1-5 原則1-6 原則1-7 2. 布局 規則2-1-1 規則2-1-2 規則2-1-3 規則2-1-4 規則2-1-5 規則2-1-6 規則2-2-1 規則2-2-2 規則2-2-3 建議2…

簡單聊聊使用lombok 的爭議

大家好&#xff0c;我是G探險者。 項目里&#xff0c;因為我使用了Lombok插件&#xff0c;然后代碼走查的時候被領導點名了。 我心想&#xff0c;這么好用的插件&#xff0c;為啥不推廣呢&#xff0c;整天寫那些煩人的setter&#xff0c;getter方法就不嫌煩么&#xff1f; 領導…

AidLux:手機/平板上的Linux環境與AI開發利器

AidLux是一個基于ARM架構的跨生態&#xff08;鴻蒙/AndroidLinux&#xff09;一站式智能物聯網&#xff08;AIoT&#xff09;應用開發和部署平臺&#xff0c;正受到越來越多開發者和用戶的青睞。既可以作為手機/平板上的一個Linux環境使用&#xff0c;也可以作為AI開發利器以發…

Python Django Suit:構建現代化的Django后臺管理

概要 Django Suit是一款為Django后臺管理提供現代、優雅界面的第三方應用&#xff0c;它致力于提升Django開發者的管理體驗。本文將深入介紹Django Suit的安裝、配置和高級功能&#xff0c;提供詳實的示例代碼&#xff0c;幫助大家更好地使用和定制Django后臺管理界面。 安裝與…

無法解除Word文檔限制編輯?上干貨

方法一&#xff1a;新建一個文檔-點擊“插入”-點擊“對象”-點擊選擇中的倒三角-然后選擇“文件中的文字”-找到相應文檔即可 具體操作界面如下圖這個方法會導致格式出現稍稍微的變化 方法二&#xff1a;將受編輯的文件另存為 文件類型一定要選擇*.xml 另存好之后是這樣的 打…

智能優化算法應用:基于法醫調查算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于法醫調查算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于法醫調查算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.法醫調查算法4.實驗參數設定5.算法結果6.參考…

力扣labuladong一刷day34天

力扣labuladong一刷day34天 文章目錄 力扣labuladong一刷day34天一、230. 二叉搜索樹中第K小的元素二、538. 把二叉搜索樹轉換為累加樹 一、230. 二叉搜索樹中第K小的元素 題目鏈接&#xff1a;https://leetcode.cn/problems/kth-smallest-element-in-a-bst/?utm_sourceLCUS&…

[C++] STL_priority_queue(優先級隊列) 的使用及底層的模擬實現,容器適配器,deque的原理介紹

文章目錄 1、priority_queue1.1 priority_queue的介紹和使用1.2 priority_queue的使用模擬實現&#xff1a; 2、容器適配器2.1 什么是適配器2.2 STL標準庫中stack和queue的底層結構 3、deque3.1 deque的原理介紹3.2 deque的缺陷 4、為什么選擇deque作為stack和queue的底層默認容…

docker配置連接harbor私有倉庫

一、前言 以下分為兩種情況說明docker對harbor私有倉庫的訪問配置&#xff0c;一種是harbor使用自建證書配置https&#xff0c;一種是使用公有證書配置https 二、docker配置 harbor使用自建證書的情況 使用自建證書對harbor進行https配置&#xff0c;docker會將該倉庫識別成不…

SDXL使用animateDiff和hotshot-xl進行文生視頻

截至2023.12.8號&#xff0c;目前市面上有兩款適用于SDXL的文生視頻開源工具&#xff0c;分別是AnimateDiff和hotshot-xl。 一、工具下載鏈接 &#xff08;1&#xff09;AnimateDiff的webui版本的git鏈接&#xff1a; GitHub - continue-revolution/sd-webui-animatediff: A…

pytest測試框架介紹(2)

繼續進步一點點&#xff0c;溫故而知新 一、requests 介紹 1、requests 的官方文檔&#xff1a;https://docs.python-requests.org/en/latest/ 2、安裝requests&#xff1a;pip install requests 二、requests請求 1、請求方法&#xff1a;post&#xff0c;get&#xff0c…

Postman獲取token

問題描述 登錄接口中帶有token參數&#xff0c;其他接口需要帶上token才能正確訪問&#xff0c;利用接口查詢用戶信息時手動在headers中更新token信息并不方便。 解決方案 在登錄接口中設置一個名為“token”的環境變量&#xff0c;value為登錄接口跑通之后responseBody中返回…

51單片機的獨立按鍵與矩陣按鍵的使用以及實例分析

IO 的使用–按鍵 本文主要涉及8051單片機的按鍵的使用&#xff0c;包括獨立按鍵與矩陣按鍵。 其中包括實例分析&#xff1a; 獨立按鍵 K1 控制 D1 指示燈亮滅通過數碼管顯示矩陣按鍵 S1-S16 按下后鍵值 0-F 文章目錄 IO 的使用--按鍵一、按鍵消抖二、獨立按鍵獨立按鍵 K1 控制 …

IAR嵌入式解決方案發布全新版本,增強云調試和仿真功能,推動下一代嵌入式軟件開發

通過先進的Arm虛擬硬件集成和Linux系統中增強的基于云的協作&#xff0c;賦能下一代嵌入式軟件開發 瑞典烏普薩拉&#xff0c;2023年12月7日 - 嵌入式開發軟件和服務的全球領導者IAR宣布推出旗艦產品IAR Embedded Workbench for Arm及IAR Build Tools for Arm最新9.50版本。此…

vue2+datav可視化數據大屏(3)

接上一節所說&#xff0c;當我們將接口封裝完了后&#xff0c;我們需要給大屏進行內容填充啦 1,新建組件 &#x1f4d3; 我們在ser-views文件夾下新建9個vue組件&#xff0c;如下圖所示&#xff0c;我給編號為1到9 &#x1f4d3;在組件里寫入內容我是第一塊...一次類推&#x…

AOSP開機動畫調測技術點(基于Android13)

AOSP開機動畫調測技術點(基于Android13) 開機動畫替換 首先&#xff0c;在你的計算機上創建一個名為"bootanimation"的文件夾&#xff0c;并將"part0"、"part1"和"desc.txt"這三個文件復制到該文件夾中。這些文件包含了開機動畫的圖像…

基于深度學習的超分辨率圖像技術一覽

超分辨率(Super-Resolution)即通過硬件或軟件的方法提高原有圖像的分辨率&#xff0c;圖像超分辨率是計算機視覺和圖像處理領域一個非常重要的研究問題&#xff0c;在醫療圖像分析、生物特征識別、視頻監控與安全等實際場景中有著廣泛的應用。 SR取得了顯著進步。一般可以將現有…