channel是golang語言級別提供的協(xié)程(goroutine)之間的通信方式。
goroutine運行在相同的地址空間,因此訪問共享內(nèi)存必須做好同步。那么goroutine之間如何進(jìn)行數(shù)據(jù)的通信呢,Go提供了一個很好的通信機(jī)制channel。channel可以與Unix shell 中的雙向管道做類比:可以通過它發(fā)送或者接收值。這些值只能是特定的類型:channel類型。定義一個channel時,也需要聲明發(fā)送到channel的值的類型。成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)十年經(jīng)驗成就非凡,專業(yè)從事網(wǎng)站設(shè)計制作、網(wǎng)站制作,成都網(wǎng)頁設(shè)計,成都網(wǎng)頁制作,軟文營銷,一元廣告等。十年來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:18980820575,我們期待您的來電!
var chanName chan ElementType
var ch chan int
使用make,可以指定channel容量
ch = make(chan int)
channel通過操作符<-來接收和發(fā)送數(shù)據(jù)
默認(rèn)情況下,channel接收和發(fā)送數(shù)據(jù)都是阻塞的,除非另一端已經(jīng)準(zhǔn)備好,這樣就使得Goroutines同步變的更加的簡單,而不需要顯式的lock。所謂阻塞,也就是如果讀?。╲alue := <-ch)它將會被阻塞,直到有數(shù)據(jù)接收。其次,任何發(fā)送(ch<-5)將會被阻塞,直到數(shù)據(jù)被讀出。無緩沖channel是在多個goroutine之間同步很棒的工具。
ch <- v // 發(fā)送v的值到channel ch-> 寫數(shù)據(jù)
v := <- ch // 從ch中接收數(shù)據(jù),并賦值給v ->讀數(shù)據(jù)
package main
import (
"fmt"
"strconv"
)
//定義一個加法函數(shù),傳入channel類型,每計算一次,quit加1
func Add(x, y int, quit chan int) {
z := x + y
fmt.Println(z)
//寫數(shù)據(jù)
quit <- 1
}
//接受數(shù)據(jù),并賦值給我
func Read(ch chan int) {
value := <- ch
fmt.Println("value" + strconv.Itoa(value))
}
func Write(ch chan int) {
//ch <- 10
}
func main() {
//定義一個channel類型切片數(shù)組
chs := make([]chan int, 10)
//循環(huán)執(zhí)行加法函數(shù)
for i := 0; i < 10; i++ {
//拿取一個channel
chs[i] = make(chan int)
//執(zhí)行g(shù)oroutine和發(fā)送一個channel類型數(shù)據(jù)
go Add(i, i, chs[i])
}
for _, v := range chs {
//接口channel類型數(shù)據(jù)
<- v
}
}
網(wǎng)站欄目:golang并發(fā)編程之channel
網(wǎng)頁路徑:http://jinyejixie.com/article24/jjpije.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、云服務(wù)器、企業(yè)建站、響應(yīng)式網(wǎng)站、靜態(tài)網(wǎng)站、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)