golang開發 channel使用

2021-10-09 19:37:09 字數 1800 閱讀 7472

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

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

make(chan type, [buffer])

chan type 通道的型別

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

向channel裡面寫入資料使用 <- 符號

q := make(chan bool)

q<-true

從channel裡面讀取資料也是使用 <- 符號,只不過寫入的channel在右邊,讀取的時候channel在左邊。意思跟方向是一致的,乙個是資料進入channel,乙個是資料從channel出去

q := make(chan bool)

<-q

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

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

func main() 

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:

有緩衝的channel,可以寫入緩衝大小個資料,可以沒有goroutine從channel讀取。

func main() 

process finished with exit code 0

執行結果跟預期是一致的。

假如我們有乙個任務需要10個goroutine去排程執行,只要有乙個goroutine執行完畢,排程就應該結束。我們看下偽**

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

func main()

fmt.println(<-ch)

fmt.println("end",runtime.numgoroutine())

wg.done()

}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) 

func main()

fmt.println(<-ch,"success")

for i:= 0;i<9;i++

fmt.println("end",runtime.numgoroutine())

wg.done()

}start 1

0 success12

4356

789end 1

process finished with exit code 0

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

golang開發 channel使用

channel主要是用於多個goroutine之間通訊 channel是引用型別,需要實用make來建立channel,如下 make chan type,buffer chan type 通道的型別 buffer 是可選引數,代表通道緩衝區的大小 省略則代表無緩衝 向channel裡面寫入資料使用...

golang開發中channel使用

channel 通道 是golang的一種重要特性,正是因為channel的存在才使得golang不同於其它語言。channel使得併發程式設計變得簡單容易有趣。channel的概念和語法 乙個channel可以理解為乙個先進先出的訊息佇列。channel用來在協程 goroutine 之前傳遞資料...

golang中channel的用法

go語言的range迴圈可以直接在channels上面迭代。使用range迴圈一次從channel中接受資料,當channel被關閉並且沒有值可接受時跳出循壞。func main close natures go func close squares for x range squares 雙向ch...