您好,登錄后才能下訂單哦!
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接收和發送數據都是阻塞的,除非另一端已經準備好,這樣就使得Goroutines同步變的更加的簡單,而不需要顯式的lock。所謂阻塞,也就是如果讀取(value := <-ch)它將會被阻塞,直到有數據接收。其次,任何發送(ch<-5)將會被阻塞,直到數據被讀出。無緩沖channel是在多個goroutine之間同步很棒的工具。
ch <- v // 發送v的值到channel ch-> 寫數據
v := <- ch // 從ch中接收數據,并賦值給v ->讀數據
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
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。