package main
import (
"fmt"
)
//go语言提供了一个结构或者形式来帮助处理多个channel的发送和接收问题,这个结构叫做select,
//select和switch相近,但是select是专门针对channel的,可以同时处理多个channel的发送与接收,
//当多个channel可以发送和接收的时候,按随机顺序处理,然后把一个个任务处理完,
func main() {
o := make(chan bool, 2) //缓存为2的channel
c1, c2 := make(chan int), make(chan string)
go func() { //go后面接上匿名函数
for { //无限循环,因为一次select之后就select代码执行完了,不使用无线循环代码就只会接收一次
//一般都是通过无限循环来实现不断的信息接收与发送操作
select {
case v, ok := <-c1:
{ //取出c1的值,v都是局部变量,不会打架,
if !ok { //ok=false,c1这个channel被关闭的时候(close(c1)),
o <- true //close(c1)的时候向o写入一个true
break //退出selecrt
}
fmt.Println("c1:", v) //打印c1的值
}
case v, ok := <-c2:
{ //取出c2的值
if !ok {
o <- true //close(c2)的时候向o写入一个true
break
}
fmt.Println("c2:", v)
}
}
}
}()
c1 <- 1
c2 <- "c2"
c1 <- 3
c2 <- "c22"
close(c1)
close(c2)
for i := 0; i < 2; i++ {
<-o //o取2次,再让main函数执行完毕
}
}
/*
c1: 1
c2: c2
c1: 3
c2: c22
*/