16-golang的無快取channel和有快取channel
阿新 • • 發佈:2018-11-07
我們先來看看無快取channel
func main() { var channel = make(chan int, 0) go func() { for i := 0; i <= 2; i++ { channel <- i fmt.Println("傳送", i) } }() for i := 0; i <= 2; i++ { num := <-channel fmt.Println("num是", num) } }
我們看一下執行結果
傳送 0
num是 0
num是 1
傳送 1
傳送 2
num是 2
我們發現,在第0輪之後,先列印了num,然後才打印了i
但是如果改變一下發送和列印的順序
func main() { var channel = make(chan int, 0) go func() { for i := 0; i <= 2; i++ { fmt.Println("傳送", i) channel <- i } }() for i := 0; i <= 2; i++ { num := <-channel fmt.Println("num是", num) } }
結果就會變成這樣
傳送 0
傳送 1
num是 0
num是 1
傳送 2
num是 2
所以這個主協程和子協程的資訊溝通還是很迅速的,看print是不能準確判斷阻塞和執行時間的
然後再來看看有快取的channel
func main() { var channel = make(chan int, 5) go func() { for i := 0; i <= 2; i++ { fmt.Println("傳送", i) channel <- i } }() for i := 0; i <= 2; i++ { num := <-channel fmt.Println("num是", num) } }
結果肯定就是
傳送 0
傳送 1
傳送 2
num是 0
num是 1
num是 2
再來看看如果把快取量改小一點會怎麼樣
var channel = make(chan int, 1)
var channel = make(chan int, 2)
兩種情況也都是
傳送 0
傳送 1
傳送 2
num是 0
num是 1
num是 2
所以快取還是給channel的資訊傳送和接收起到了重要的作用