1. 程式人生 > >golang並發編程之channel

golang並發編程之channel

val 地址空間 println 共享 pac shel pack 讀數 都是

一、概念
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
    }
}

golang並發編程之channel