非緩衝通道:
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