func fibonacci(n int, c chanint){
x, y :=0,1 fori:=0;i < n;i++{
c <- x
x, y = y, x+y } close(c) }
func main(){
c :=make(chanint,10) go fibonacci(cap(c), c) // range 函数遍历每个从通道接收到的数据,因为 c 在发送完 10 个 // 数据之后就关闭了通道,所以这里我们 range 函数在接收到 10 个数据 // 之后就结束了。如果上面的 c 通道不关闭,那么 range 函数就不 // 会结束,从而在接收第 11 个数据的时候就阻塞了。 fori:=range c {
fmt.Println(i) } }
执行输出结果为:
0112358132134
Select 语句
select 语句使得一个 goroutine 可以等待多个通信操作。 select 会阻塞,直到其中的某个 case 可以继续执行:
实例
package main
import"fmt"
func fibonacci(c, quit chanint){
x, y :=0,1 for{ select{ case c <- x:
x, y = y, x+y case <-quit:
fmt.Println("quit") return } } }
func main(){
c :=make(chanint)
quit :=make(chanint)