-
Notifications
You must be signed in to change notification settings - Fork 0
/
channel_idiom.go
59 lines (52 loc) · 1.56 KB
/
channel_idiom.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package main
import (
"fmt"
"time"
)
func main() {
stream := pump2()
go suck2(stream)
time.Sleep(5e4)
fmt.Println("-------hi----------------------------")
suck3(pump3())
time.Sleep(5e4)
}
// 默认情况下,通信是同步且无缓冲的:在有接受者接收数据之前,发送不会结束。可以想象一个无缓冲的通道在没有空间来保存数据的时候:
// 必须要一个接收者准备好接收通道的数据然后发送者可以直接把数据发送给接收者。所以通道的发送/接收操作在对方准备好之前是阻塞的:
//
// 1)对于同一个通道,发送操作(协程或者函数中的),在接收者准备好之前是阻塞的:如果 ch 中的数据无人接收,就无法再给通道传入
// 其他数据:新的输入无法在通道非空的情况下传入。所以发送操作会等待 ch 再次变为可用状态:就是通道值被接收时(可以传入变量)。
//
// 2)对于同一个通道,接收操作是阻塞的(协程或函数中的),直到发送者可用:如果通道中没有数据,接收者就阻塞了。
//
// 尽管这看上去是非常严格的约束,实际在大部分情况下工作的很不错。
func pump2() chan int {
ch := make(chan int)
go func() {
for i := 0; ; i++ {
ch <- i
}
}()
return ch
}
func suck2(ch chan int) {
for {
fmt.Println(<-ch)
}
}
func pump3() chan int {
ch := make(chan int)
go func() {
for i := 0; ; i++ {
ch <- i
}
}()
return ch
}
func suck3(ch chan int) {
go func() {
for v := range ch {
fmt.Println(v)
}
}()
}