1、代碼
2、運行
3、解析
1、代碼 buffer.go
1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func readThread(ch chan int) { 9 fmt.Println("read for reading...") 10 for i := range ch { 11 fmt.Println("get i : ", i) 12 if 20 == i { 13 break 14 } 15 time.Sleep(1e8) 16 } 17 fmt.Println("read over...") 18 } 19 20 func main() { 21 ch := make(chan int, 1024) 22 go readThread(ch) 23 time.Sleep(1e9 * 2) 24 for i := 1; i <= 20; i++ { 25 ch <- i 26 } 27 fmt.Println("waitting for reading...") 28 time.Sleep(1e9 * 3) 29 fmt.Println("over...") 30 }
2、運行
1 $ go run buffer.go 2 read for reading... 3 waitting for reading... 4 get i : 1 5 get i : 2 6 get i : 3 7 get i : 4 8 get i : 5 9 get i : 6 10 get i : 7 11 get i : 8 12 get i : 9 13 get i : 10 14 get i : 11 15 get i : 12 16 get i : 13 17 get i : 14 18 get i : 15 19 get i : 16 20 get i : 17 21 get i : 18 22 get i : 19 23 get i : 20 24 read over... 25 over...
3、解析
根據運行結果進行分析:
1)先運行的readThread讀線程,讀線程已經做好了讀的准備,但此時channel中還沒有數據,所以阻塞了。等待讀動作。
2)主線程中,一次性向channel中寫入大量數據,由於有緩沖機制,所以可以一次性的寫入多個數據而不會阻塞。當主線程寫完了數據,就開始等待讀線程的讀動作結束。
3)channel中開始有數據,讀線程開始讀數據,每0.1秒鍾讀取一個數據,一共讀取20次。讀取結束了,打印read over。
4)主線程等待的時間到了,返回,退出