golang開發中channel使用

2022-09-24 11:00:08 字數 1181 閱讀 6576

channel[通道]是golang的一種重要特性,正是因為channel的存在才使得golang不同於其它語言。channel使得併發程式設計變得簡單容易有趣。

channel的概念和語法

乙個channel可以理解為乙個先進先出的訊息佇列。channel用來在協程[goroutine]之前傳遞資料,準確的說,是用來傳遞資料的所有權。乙個設計良好的程式應該確保同一時刻channel裡面的資料只會被同乙個協程擁有,這樣就可以避免併發帶來的資料不安全問題[data races]。

正文channel主要是用於多個goroutine之間通訊

channel語法

channel是引用型別,需要實用make來建立channel,如下

make(chan type, [buffer])

chan type 通道的型別

buffer 是可選引數,代表通道緩衝區的大小(省略則代表無緩衝)

向channel裡面寫入資料使用

q := make(chan bowww.cppcns.comol)

q從channel裡面讀取資料也是使用

q := make(chan bool)

有緩衝channel的使用

我們一直使用的無緩衝的channel,今天主要學習下有快取的channel。

無緩衝的channel,寫入資料後一定要有goroutine 從channel讀取資料後再寫入,否則程式會panic。

func main()

start 1

test code

9end 10

從執行結果上看,是第9個goroutine首先執行完畢了。程式也正常退出了。但是我們看到,加上主goroutine,記憶體中一共有11個goroutine,程式退出的時候還有10個goroutine,減去乙個主goroutine,還有9個goroutine沒有退出,這個對程式來說是不允許,可能會洩漏或者長期占用資源不釋放。

但是我們如果使用了有緩衝的channel,就可以利用channel的緩衝機制正常退出全部的goroutine了。

看下**

func test(wg *sync.waitgroup,ch chan int,i int)

fmt.println(

列印success的時候,第乙個goroutine已經將任務完成,迴圈9次將channel裡面的資料讀取出來,保證建立的go都不會阻塞能夠正常退出來。

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...