Golang 选择语句

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程