Introduction
This lab aims to test your knowledge of Go's select
statement, which allows you to wait on multiple channel operations.
This tutorial is from open-source community. Access the source code
This lab aims to test your knowledge of Go's select
statement, which allows you to wait on multiple channel operations.
In this lab, you are given two channels, c1
and c2
, which will receive a value after some amount of time. Your task is to use select
to await both of these values simultaneously, printing each one as it arrives.
select
statement to wait on both channels.## We receive the values `"one"` and then `"two"` as
## expected.
$ time go run select.go
received one
received two
## Note that the total execution time is only ~2 seconds
## since both the 1 and 2 second `Sleeps` execute
## concurrently.
real 0m2.245s
There is the full code below:
// Go's _select_ lets you wait on multiple channel
// operations. Combining goroutines and channels with
// select is a powerful feature of Go.
package main
import (
"fmt"
"time"
)
func main() {
// For our example we'll select across two channels.
c1 := make(chan string)
c2 := make(chan string)
// Each channel will receive a value after some amount
// of time, to simulate e.g. blocking RPC operations
// executing in concurrent goroutines.
go func() {
time.Sleep(1 * time.Second)
c1 <- "one"
}()
go func() {
time.Sleep(2 * time.Second)
c2 <- "two"
}()
// We'll use `select` to await both of these values
// simultaneously, printing each one as it arrives.
for i := 0; i < 2; i++ {
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
}
}
}
This lab tests your ability to use the select
statement in Go to wait on multiple channel operations. By completing this lab, you will gain a better understanding of how to use select
to coordinate concurrent goroutines.