Search⌘ K

Select Statement

Explore how the select statement manages multiple channel communications in Go concurrency. Learn to handle blocking issues, use default and nil cases, and improve concurrent program efficiency.

We'll cover the following...

The select statement blocks the code and waits for multiple channel opera­tions simul­taneously.

Syntax

The syntax for the select statement is as follows:

C++
select {
case channel operation:
statement(s);
. //more cases
.
.
default : //Optional
statement(s);
}

Example

Let’s try to understand the usage of a select statement with a simple example consisting of two channels which are communicating using send/receive operations:

Go (1.6.2)
package main
import (
"fmt"
"time"
)
func main() {
channel1 := make(chan string)
channel2 := make(chan string)
go func() {
for i := 0; i < 5; i++ {
channel1 <- "I'll print every 100ms"
time.Sleep(time.Millisecond * 100)
}
}()
go func() {
for i := 0; i < 5; i++ {
channel2 <- "I'll print every 1s"
time.Sleep(time.Second * 1)
}
}()
for i := 0; i < 5; i++ {
fmt.Println(<-channel1)
fmt.Println(<-channel2)
}
}

In the code above, we have two goroutines, each of which is sending messages on each of the two channels.

The first goroutine sends a message I'll print every 100ms and then waits for 100ms before sending the message again in the next iteration.

go func() {
	for i := 0; i < 5; i++
...