select
一、select的使用
select是用来监听和channel有关的IO操作,当 IO 操作发生时,触发相应的动作。类似switch分支语句
package main
import "fmt"
func Man(foot string) {
fmt.Println("我是铲屎官,我投食了" + foot)
}
func Cat1() {
fmt.Println("我是猫主子,我在吃",)
}
func main() {
// 猫盆大小,只能存放10个缓存大小
ch := make(chan string,10)
defer close(ch)
for i:=0;i<20;i++{
fmt.Println(i)
select {
case ch <- "猫粮":
Man("猫粮")
case <- ch:
Cat1()
case ch<- "猫罐头":
Man("猫罐头")
case <- ch:
Cat1()
default:
fmt.Println("都阻塞了")
break
}
}
}
当缓存大小为1的时候,就是先投食再吃,再投食,再吃,这样的顺序了
select的特点:
- 语句只能用于信道的读写操作
- select 可以同时监听多个 channel 的写入或读取
- 执行 select 时,若只有一个 case 通过(不阻塞),则执行这个 case 块
- 若有多个 case 通过,则随机挑选一个 case 执行
- 若所有 case 均阻塞,且定义了 default 模块,则执行 default 模块。若未定义 default 模块,则 select 语句阻塞,直到有 case 被唤醒。
- 使用 break 会跳出 select 块。
二、超时:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int,5)
for i:=0;i<10;i++ {
select {
case ch <- 3:
fmt.Printf("写操作,写入的数据为:%d\n",3)
case <- time.After(time.Second *2):
fmt.Println("写入超时")
}
}
}