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
|
package main
import (
"fmt"
"time"
)
func main() {
var c1, c2, c3 chan int // nil
var i1, i2 int
// 由于selectgo函数的源代码可知,go会把所有非nil的channel组成一个send+recv集
// 然后all channel lock 伪随机的遍历case集。
// 由于这里只有Timer.C这个chan在case集中,则获取lock然后从这里读取数据,不能立刻完成则被挂起等待。
select {
case i1 = <-c1:
fmt.Printf("received ", i1, "from c1\n")
case c2 <- i2:
fmt.Printf("sent ", i2, "to c2\n")
case i3, ok := (<-c3):
if ok {
fmt.Printf("received ", i3, "from c3\n")
} else {
fmt.Printf("c3 is closed\n")
}
// func After(d Duration) <-chan Time
// After会在另一线程经过时间段d后向返回值发送当时的时间。等价于NewTimer(d).C
case <-time.After(time.Second * 3): // 超时退出
fmt.Println("request time out")
}
// Output:
// request time out
}
|