语法: select case

select case多和for的死循环连用

  1. // 在多个管道中只要有一个操作成功,就执行相应的逻辑
  2. channelA:=make(chan int)
  3. channelB:=make(chan int)
  4. go func(){
  5. time.Sleep(3*time.Second)
  6. channelA<-1
  7. }()
  8. select {
  9. case <-channelA: // 也可以直接给变量赋值,如 v,ok:=<-channelA
  10. fmt.Println("a")
  11. case <-channelB:
  12. fmt.Println("b")
  13. default:
  14. fmt.Println("default")
  15. }
  16. time.sleep(10*time.Second)

当有满足条件的channel时就会执行这个channel

当管道有close的时候
  1. // 在多个管道中只要有一个操作成功,就执行相应的逻辑
  2. channelA:=make(chan int)
  3. channelB:=make(chan int)
  4. go func(){
  5. time.Sleep(3*time.Second)
  6. channelA<-1
  7. close(channelA) //这里关闭管道
  8. }()
  9. <-channelA
  10. select {
  11. case v,ok:=<-channelA:
  12. fmt.Println(v,ok)
  13. case <-channelB:
  14. fmt.Println("b")
  15. default:
  16. fmt.Println("default")
  17. }
  18. time.sleep(10*time.Second)

以上结果为v=0 ,ok=false,管道关闭依然是可以获取到值的

文档更新时间: 2021-08-22 12:41   作者:张尚