1. 程式人生 > >16-golang的無快取channel和有快取channel

16-golang的無快取channel和有快取channel

 

我們先來看看無快取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的資訊傳送和接收起到了重要的作用