Go语言中的Select语句


在Go语言中,select语句就像switch语句一样,但是在select语句中,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
  • 解释:在上面的程序中,门户 1 休眠 3 秒,门户 2 休眠 9 秒,休眠时间结束后,它们将准备继续。现在,select语句等待直到它们的睡眠时间,当门户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
  • select语句中的default语句用于保护select语句不被阻塞。当没有 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
  • select语句的阻塞是指当没有case语句准备好并且select语句不包含任何default语句时,select语句会阻塞,直到至少有一个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
  • 在 select 语句中,如果准备进行多个情况,则可以随机选择其中之一。 例子:
// 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


原文链接:codingdict.net