Golang語言並行設計的核心goroutine

frankphper發表於2019-05-08

goroutine實現併發程式設計,goroutine之間通訊使用channel,channel不管是傳送資料還是接收資料都是阻塞的,channel預設無緩衝,但也可以指定緩衝大小變成有緩衝,空間有剩餘時是無阻塞,直到空間全部用完時才阻塞。

/**
 * goroutine實現併發程式設計
 * goroutine之間通訊使用channel
 * channel不管是傳送資料還是接收資料都是阻塞的
 * channel預設無緩衝,但也可以指定緩衝大小變成有緩衝,空間有剩餘時是無阻塞,直到空間全部用完時才阻塞
 */
package main

import (
    "fmt"
)

func sum(a []int, c chan int) {
    total := 0
    for _, v := range a {
        total += v
    }
    // 傳送total到c
    c <- total
}
func fibonacci(n int, c chan int) {
    x, y := 1, 1
    for i := 0; i < n; i++ {
        // 傳送x到c
        c <- x
        x, y = y, x+y
    }
    // 通過內建函式close關閉channel
    close(c)
}
func main() {
    a := []int{9, 2, 6, -5, 3, 0}
    // 使用make建立channel,預設無緩衝,阻塞
    c := make(chan int)
    // 使用go關鍵字啟動goroutine
    go sum(a[:len(a)], c)
    go sum(a[len(a)/2:], c)
    // 從c中接收資料
    x, y := <-c, <-c
    fmt.Println(x, y, x+y)
    // 使用make建立有緩衝的channel,空間有剩餘時是無阻塞,直到空間全部用完時才阻塞
    // 修改2為1則報錯,修改2為3則正常
    c1 := make(chan int, 2)
    c1 <- 1
    c1 <- 2
    fmt.Println(<-c1)
    fmt.Println(<-c1)
    c2 := make(chan int, 10)
    // 使用go關鍵字啟動goroutine
    go fibonacci(cap(c2), c2)
    // 使用range讀取channel
    for i := range c2 {
        fmt.Println(i)
    }
}

相關文章