golang併發程式設計之channel
一、概念
channel是golang語言級別提供的協程(goroutine)之間的通訊方式。
goroutine執行在相同的地址空間,因此訪問共享記憶體必須做好同步。那麼goroutine之間如何進行資料的通訊呢,Go提供了一個很好的通訊機制channel。channel可以與Unix shell 中的雙向管道做類比:可以通過它傳送或者接收值。這些值只能是特定的型別:channel型別。定義一個channel時,也需要定義傳送到channel的值的型別。
二、宣告方式
var chanName chan ElementType var ch chan int 使用make,可以指定channel容量 ch = make(chan int)
三、channel得讀和寫
channel通過操作符<-來接收和傳送資料
ch <- v// 傳送v到channel ch. 寫資料 v := <- ch // 從ch中介面資料,並賦值給v 讀資料
預設情況下,channel接收和傳送資料都是阻塞的,除非另一端已經準備好,這樣就使得Goroutines同步變的更加的簡單,而不需要顯式的lock。所謂阻塞,也就是如果讀取(value := <-ch)它將會被阻塞,直到有資料接收。其次,任何傳送(ch<-5)將會被阻塞,直到資料被讀出。無緩衝channel是在多個goroutine之間同步很棒的工具。
四、code
package main import ( "fmt" "strconv" ) //定義一個加法函式,傳入channel型別,每計算一次,quit加1 func Add(x, y int, quit chan int){ z := x + y fmt.Println(z) //寫資料 quit <- 1 } //接受資料,並賦值給我 func Read(ch chan int){ value := <- ch fmt.Println("value" + strconv.Itoa(value)) } func Write(ch chan int){ //ch <- 10 } func main(){ //定義一個channel型別切片陣列 chs := make([]chan int, 10) //迴圈執行加法函式 for i := 0; i < 10; i++ { //拿取一個channel chs[i] = make(chan int) //執行goroutine和傳送一個channel型別資料 go Add(i, i, chs[i]) } for _, v := range chs { //介面channel型別資料 <- v } }