Open In App

Select Statement in Go Language

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

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




// 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)
}
  
}


  • Output: 
     
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{}
  • Example:
     

Go




// Go program to illustrate the
// concept of select statement
package main
 
// main function
func main() {
  
 // Select statement
// without any case
select{ }
 
  
}


  • Output: 
     
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




// 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")
}
}


  • Output: 
     
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




// 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:
   
}
}


  • Output: 
     
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




// 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)
}
}


  • Output: 
     
Welcome to channel 2

 

 



Last Updated : 21 Nov, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads