select语句可以用来等待多个channel,直到其中一个channel可以读取到数据或者写入数据成功。
示例:
package main
import "fmt"
// 计算数列
func fibonacci(c, quit chan int) {
x, y := 0, 1
// 开始一个死循环
for {
// 通过select等待通道c和quit,看那个有反应,就执行对应的case语句中的代码
select {
case c <- x:
// 如果通道c写入数据成功,执行这里的计算逻辑
x, y = y, x+y
case <-quit:
// 如果收到通道quit的数据,就退出函数,结束计算
fmt.Println("quit")
return
}
}
}
func main() {
// 定义一个channel,用来接收计算结果
c := make(chan int)
// 定义一个channel,用来传递停止计算的通知
quit := make(chan int)
// 创建一个协程,用来打印计算结果
go func() {
// 打印10个计算结果
for i := 0; i < 10; i++ {
// 循环从c通道中读取10次数据
fmt.Println(<-c)
}
// 往quit通道中发送数据0,通知fibonacci函数退出计算,主协程就结束了
quit <- 0
}()
// 开始计算斐波拉契数列
fibonacci(c, quit)
}
运行结果:
0
1
1
2
3
5
8
13
21
34
quit