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)主线程等待的时间到了,返回,退出