Go 语言 select 语句


select是Go中的一个控制结构,类似于用于通信的switch语句。每个case必须是一个通信操作,要么是发送要么是接收。

select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。一个默认的子句应该总是可运行的。

语法

Go 编程语言中 select 语句的语法如下:

  1. select {
  2. case communication clause :
  3. statement(s);
  4. case communication clause :
  5. statement(s);
  6. /* 你可以定义任意数量的 case */
  7. default : /* 可选 */
  8. statement(s);
  9. }

以下描述了 select 语句的语法:

  • 每个case都必须是一个通信
  • 所有channel表达式都会被求值
  • 所有被发送的表达式都会被求值
  • 如果任意某个通信可以进行,它就执行;其他被忽略。
  • 如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行。
    否则:
    1. 如果有default子句,则执行该语句。
    2. 如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。

实例

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func main() {
  6. var c1, c2, c3 chan int
  7. var i1, i2 int
  8. select {
  9. case i1 = <-c1:
  10. fmt.Printf("received ", i1, " from c1\n")
  11. case c2 <- i2:
  12. fmt.Printf("sent ", i2, " to c2\n")
  13. case i3, ok := (<-c3): // same as: i3, ok := <-c3
  14. if ok {
  15. fmt.Printf("received ", i3, " from c3\n")
  16. } else {
  17. fmt.Printf("c3 is closed\n")
  18. }
  19. default:
  20. fmt.Printf("no communication\n")
  21. }
  22. }

以上代码执行结果为:

  1. no communication