select 语句可以使得一个 goroutine 在多个通讯操作上等待。select 会阻塞,直到条件分支中的某个分支可以执行,就执行此分支。当多个分支都准备好的时候,会随机执行一个。
这个 select 还是使用 fibonacci
函数来实现。
func fibonacci(c, quit chan int) {
x, y := 0, 1
for{
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
而使用这个函数里的通道,我们建立一个 goroutine,做一个 10 次的循环。在循环中取得通道返回的值。并在循环结束后,接收另一个通道的值。
go func() {
for i := 0; i < 10; i++{
fmt.Println(<- c)
}
quit <- 0
}()
完整代码
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for{
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++{
fmt.Println(<- c)
}
quit <- 0
}()
fibonacci(c, quit)
}
运行结果如下
0
1
1
2
3
5
8
13
21
34
quit