Go 語言 select 語句
select 是 Go 中的一個控制結構,類似於用於通信的 switch 語句。每個 case 必須是一個通信操作,要麼是發送要麼是接收。
select 隨機執行一個可運行的 case。如果沒有 case 可運行,它將阻塞,直到有 case 可運行。一個默認的子句應該總是可運行的。
語法
Go 編程語言中 select 語句的語法如下:
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定義任意數量的 case */
default : /* 可選 */
statement(s);
}
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定義任意數量的 case */
default : /* 可選 */
statement(s);
}
以下描述了 select 語句的語法:
- 每個 case 都必須是一個通信
- 所有 channel 運算式都會被求值
- 所有被發送的運算式都會被求值
- 如果任意某個通信可以進行,它就執行,其他被忽略。
-
如果有多個 case 都可以運行,Select 會隨機公平地選出一個執行。其他不會執行。
否則:- 如果有 default 子句,則執行該語句。
- 如果沒有 default 子句,select 將阻塞,直到某個通信可以運行;Go 不會重新對 channel 或值進行求值。
實例
select 語句應用演示:
實例
package main
import "fmt"
func main() {
var c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1:
fmt.Printf("received ", i1, " from c1\n")
case c2 <- i2:
fmt.Printf("sent ", i2, " to c2\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok {
fmt.Printf("received ", i3, " from c3\n")
} else {
fmt.Printf("c3 is closed\n")
}
default:
fmt.Printf("no communication\n")
}
}
import "fmt"
func main() {
var c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1:
fmt.Printf("received ", i1, " from c1\n")
case c2 <- i2:
fmt.Printf("sent ", i2, " to c2\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok {
fmt.Printf("received ", i3, " from c3\n")
} else {
fmt.Printf("c3 is closed\n")
}
default:
fmt.Printf("no communication\n")
}
}
以上代碼執行結果為:
no communication