/*
Go里面提供了一个关键字select,通过select可以监听channel上的数据流动
selec的用法与switch语言非常类似,由select开始一个新的选择快,每个选
择条件由case语句来描述。
但是select的每个case语句必须是一个IO操作。
select结构
select{
case <-chan1:
//如果channel成功读到数据,则进行该case处理与语句
case chan2<-:
//如果成功向chan2写入数据,则进行该case处理语句
default:
//如果上面没有成功,则进入default处理语句(需要考虑资源消耗)
}
!!!在一个select语句中,Go语言会按照顺序从头到尾评估每一个发送和接收
的语句。如果其中任意一语句可以继续执行(即没有被阻塞),那么就那些可以执行的
语句中任意选择一条来使用。
下面是一个通过select实现菲波那切数列的例子
*/
package main
import "fmt"
//通过select实现菲波那切数列(fibonacci)
func fibonacci(ch chan<-int,quit <-chan bool){
x,y:=1,1
for{
//监听ch的数据流动
select{
case ch<-x:
x,y=y,x+y
case flag:=<-quit:
if flag{
fmt.Println("是否结束:",flag)
return
}
}
}
}
func main(){
//数字通信
ch:=make(chan int)
//程序是否结束
quit:=make(chan bool)
//消费者,从ch读取内容
go func(){//新建协程
for i:=0;i<8;i++{
num:=<-ch;
fmt.Println(num)
}
//可以停止
quit<-true
}()//别忘了()
//生产者,产生数字,写入channel
fibonacci(ch,quit)
}