Go 緩衝通道(bufchan)用法

LiberHome發表於2022-05-31

非緩衝通道:

make(chan T)
一次傳送 一次接收 都是阻塞的

緩衝通道:

make(chan T, capacity)
傳送:緩衝區資料滿了才阻塞
接收:緩衝區資料空了才接收 

舉個例子:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    //非緩衝通道
    ch1 := make(chan int)
    fmt.Println(len(ch1), cap(ch1)) //0 0

    //快取通道
    ch2 := make(chan int, 5)
    ch2 <- 100
    ch2 <- 200
    ch2 <- 300
    ch2 <- 400
    ch2 <- 500
    fmt.Println(len(ch2), cap(ch2))
    fmt.Println("=======================")
    ch3 := make(chan string, 4)
    //    啟動一個子協程 放進去ch3
    go sendData(ch3)
    for {
        v, ok := <-ch3
        if !ok {
            fmt.Println("Reading completed ")
            break
        }
        fmt.Println("\tthe data read is : ", v)
    }
    fmt.Println("main-goroutine is finished")
}

func sendData(ch chan string) {
    for i := 0; i < 10; i++ {
        ch <- "Data " + strconv.Itoa(i)
        fmt.Println("子協程寫入第 %d 個資料", i)
    }
    close(ch)
}

執行結果是:

0 0
5 5
=======================
子協程寫入第 %d 個資料 0
子協程寫入第 %d 個資料 1
子協程寫入第 %d 個資料 2
子協程寫入第 %d 個資料 3
子協程寫入第 %d 個資料 4
        the data read is :  Data 0
        the data read is :  Data 1
        the data read is :  Data 2
        the data read is :  Data 3
        the data read is :  Data 4
        the data read is :  Data 5
子協程寫入第 %d 個資料 5
子協程寫入第 %d 個資料 6
子協程寫入第 %d 個資料 7
子協程寫入第 %d 個資料 8
子協程寫入第 %d 個資料 9
        the data read is :  Data 6
        the data read is :  Data 7
        the data read is :  Data 8
        the data read is :  Data 9
Reading completed 
main-goroutine is finished

其實就是緩衝區大小我們設為4導致的。

參考:bilibili

相關文章