golang並發編程之channel

來源:互聯網
上載者:User

標籤:訪問   加法   lock   func   read   main   type   操作符   name   

一、概念
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 mainimport (    "fmt"    "strconv")//定義一個加法函數,傳入channel類型,每計算一次,quit加1func 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    }}

golang並發編程之channel

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.