在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
// 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
// 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
原文链接:codingdict.net