使用两个Goroutine,向标准输出中按顺序按顺序交替打出字母与数字,输出是a1b2c3…z26 ~
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
|
func main() {
letter , number := make(chan bool), make(chan bool) // 使用两个channel交替实现
wait := sync.WaitGroup{}
go func(){
i := 1
for {
select { // 轮训
case <- number:
fmt.Println(i)
i++
letter <- true
}
}
}()
wait.Add(1)
go fun(wait *sync.WaitGroup) {
for ch := 'a' ; ch <= 'z' ; ch++ {
select {
case <- letter :
if ch > 'z' {
wait.Done()
return
}
fmt.Println("%c",ch)
number <- true
}
}
}(&wait)
number <- true // 第一次打印触发
wait.Wait() // 主程序等待字母打印完成
}
|
select 语法使用
1
2
3
4
5
6
7
8
9
|
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定义任意数量的 case */
default : /* 可选 */
statement(s);
}
|
每个case都必须是一个通信
所有channel表达式都会被求值
所有被发送的表达式都会被求值
如果任意某个通信可以进行,它就执行;其他被忽略
如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行
否则:
如果有default子句,则执行该语句
如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值