In Go language, the select statement is just like switch statement, but in the select statement, case statement refers to communication, i.e. sent or receive operation on the channel.
Syntax:
select{
case SendOrReceive1: // Statement
case SendOrReceive2: // Statement
case SendOrReceive3: // Statement
.......
default: // Statement
Important points:
- Select statement waits until the communication(send or receive operation) is prepared for some cases to begin.
Example:
C
package main
import( "fmt"
"time" )
func portal1(channel1 chan string) {
time .Sleep(3* time .Second)
channel1 <- "Welcome to channel 1"
}
func portal2(channel2 chan string) {
time .Sleep(9* time .Second)
channel2 <- "Welcome to channel 2"
}
func main(){
R1:= make(chan string)
R2:= make(chan string)
go portal1(R1)
go portal2(R2)
select{
case op1:= <- R1:
fmt.Println(op1)
case op2:= <- R2:
fmt.Println(op2)
}
}
|
Welcome to channel 1
- Explanation: In the above program, portal 1 sleep for 3 seconds and portal 2 sleep for 9 seconds after their sleep time over they will ready to proceed. Now, select statement waits till their sleep time, when the portal 1 wakes up, it selects case 1 and prints “Welcome to channel 1”. If the portal 2 wakes up before portal 1 then the output is “welcome to channel 2”.
- If a select statement does not contain any case statement, then that select statement waits forever.
Syntax:
select{}
Go
package main
func main() {
select { }
}
|
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [select (no cases)]:
main.main()
/home/runner/main.go:9 +0x20
exit status 2
- The default statement in the select statement is used to protect select statement from blocking. This statement executes when there is no case statement is ready to proceed.
Example:
Go
package main
import "fmt"
func main() {
mychannel:= make( chan int)
select {
case <- mychannel:
default :fmt.Println( "Not found" )
}
}
|
Not found
- The blocking of select statement means when there is no case statement is ready and the select statement does not contain any default statement, then the select statement block until at least one case statement or communication can proceed.
Example:
Go
package main
func main() {
mychannel:= make( chan int)
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
- In select statement, if multiple cases are ready to proceed, then one of them can be selected randomly.
Example:
Go
package main
import "fmt"
func portal1(channel1 chan string ){
for i := 0 ; i <= 3 ; i++{
channel1 <- "Welcome to channel 1"
}
}
func portal2(channel2 chan string ){
channel2 <- "Welcome to channel 2"
}
func main() {
R1:= make( chan string )
R2:= make( chan string )
go portal1(R1)
go portal2(R2)
select {
case op1:= <- R1:
fmt.Println(op1)
case op2:= <- R2:
fmt.Println(op2)
}
}
|
Welcome to channel 2