本教材由知了传课辛苦制作而成,仅供学习使用,请勿用于商业用途!如进行转载请务必注明出处!谢谢!

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("写入超时") } } }

1377人已阅读,今天你学习了吗?

添加新回复