并发编程select
如果多管道,一般使用for循环读取。
package main
import "fmt"
func main() {
ch1:=make(chan int)
go func(){
sum:=0
for i := 1; i < 1000; i++ {
sum+=i
ch1<-sum
}
close(ch1) //关闭管道
}()
ch2:=make(chan int)
go func(){
for i := 1; i < 1000; i++ {
ch2<-i+2
}
close(ch2) //关闭管道
}()
// for { //死循环方式读取管道值
// value,ok:=<-ch1
// if ok{
// fmt.Println(" for ch1=",value)
// }else{
// break
// }
// }
// for c:=range ch1{ //较为推荐的for-range读取,直到管道关闭就不再接收。
// fmt.Println("range cha1=",c)
// }
//如果定义多个管道,那么以上两种就有点吃力了,引入select方法
for {
select { //必须为IO操作,要么读要么写。当多个分支条件满足时,会随机选择一个分支执行,本题需要持续接收值,所以需要加for
case value,ok:=<-ch1:
if ok {
fmt.Println("select ch1=",value)
}
case value,ok:=<-ch2:
if ok {
fmt.Println("select ch2=",value)
}
}
}
fmt.Println("main 结束") //为啥不执行这个?
}