Golang 选择语句
在Go语言中,选择语句与switch语句一样,但在选择语句中,case语句指的是通信,即通道上的发送或接收操作。
语法:
select{
case SendOrReceive1: // Statement
case SendOrReceive2: // Statement
case SendOrReceive3: // Statement
.......
default: // Statement
要点:
- 选择语句会等待通信(发送或接收操作)准备好的某些情况下才开始。
例子:
// Go program to illustrate the
// concept of select statement
package main
import("fmt"
"time")
// function 1
func portal1(channel1 chan string) {
time.Sleep(3*time.Second)
channel1 <- "Welcome to channel 1"
}
// function 2
func portal2(channel2 chan string) {
time.Sleep(9*time.Second)
channel2 <- "Welcome to channel 2"
}
// main function
func main(){
// Creating channels
R1:= make(chan string)
R2:= make(chan string)
// calling function 1 and
// function 2 in goroutine
go portal1(R1)
go portal2(R2)
select{
// case 1 for portal 1
case op1:= <- R1:
fmt.Println(op1)
// case 2 for portal 2
case op2:= <- R2:
fmt.Println(op2)
}
}
- 输出:
Welcome to channel 1
- 解释: 在上面的程序中,portal 1睡了3秒,portal 2睡了9秒,在他们的睡眠时间结束后,他们将准备进行。现在,选择语句等待他们的睡眠时间,当门户1醒来时,它选择案例1并打印出 “欢迎来到频道1″。如果门户2在门户1之前醒来,那么输出是 “欢迎来到频道2″。
-
如果一个select语句不包含任何case语句,那么这个select语句会永远等待。
语法:
select{}
- 例如:
// Go program to illustrate the
// concept of select statement
package main
// main function
func main() {
// Select statement
// without any case
select{ }
}
- 输出:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [select (no cases)]:
main.main()
/home/runner/main.go:9 +0x20
exit status 2
- 选择语句中的默认语句是用来保护选择语句不被阻塞的。当没有case语句准备进行时,该语句会执行。
例子:
// Go program to illustrate the
// concept of select statement
package main
import "fmt"
// main function
func main() {
// creating channel
mychannel:= make(chan int)
select{
case <- mychannel:
default:fmt.Println("Not found")
}
}
- 输出:
Not found
-
选择语句的阻塞是指当没有case语句准备好,并且选择语句不包含任何默认语句时,那么选择语句阻塞,直到至少有一个case语句或通信可以进行。
例子:
// Go program to illustrate the
// concept of select statement
package main
// main function
func main() {
// creating channel
mychannel:= make(chan int)
// channel is not ready
// and no default case
select{
case <- mychannel:
}
}
- 输出:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/home/runner/main.go:14 +0x52
exit status 2
- 在选择语句中,如果有多个案例准备进行,那么可以随机选择其中一个。
例子:
// Go program to illustrate the
// concept of select statement
package main
import "fmt"
// function 1
func portal1(channel1 chan string){
for i := 0; i <= 3; i++{
channel1 <- "Welcome to channel 1"
}
}
// function 2
func portal2(channel2 chan string){
channel2 <- "Welcome to channel 2"
}
// main function
func main() {
// Creating channels
R1:= make(chan string)
R2:= make(chan string)
// calling function 1 and
// function 2 in goroutine
go portal1(R1)
go portal2(R2)
// the choice of selection
// of case is random
select{
case op1:= <- R1:
fmt.Println(op1)
case op2:= <- R2:
fmt.Println(op2)
}
}
- 输出:
Welcome to channel 2