If you are an experience Go developer this will likely all be review, but I wanted to share it since I am working on a more in-depth tutorial that requires a reasonable understanding of channels and Go’s select statement.
Let’s start with the basics - imagine that you have a channel named someChannel and you are waiting on a signal from that channel. In Go we can do this with the following code.
// Waiting for a message from a single channel.
<-someChannelIf we want the value sent over the channel, we can assign it to a variable.
value := <-someChannelQuite frequently, we will want to tell our program to wait for a message from one of multiple channels. What we basically want is a switch statement that can wait for a message from one of multiple channels.
// This is NOT valid Go code.
switch {
case <-someChannel:
// ...
case <-someOtherChannel:
// ...
}We can do this using the select statement, which looks very similar to the switch statement, but is tailored specifically for waiting for messages from multiple channels.
select {
case <-someChannel:
// ...
case <-someOtherChannel:
// ...
}When we use the select statement, our program will block until one of the channels has a message, at which point the select statement will execute the corresponding case block. We can see a complete example in the following code.
package main
import (
"fmt"
"time"
)
func main() {
chA, chB := make(chan int), make(chan int)
go func() {
time.Sleep(1 * time.Second)
chA <- 2
}()
go func() {
time.Sleep(2 * time.Second)
chB <- 3
}()
select {
case a := <-chA:
fmt.Println("A", a)
case b := <-chB:
fmt.Println("B", b)
}
}
In this example we can also see another unique difference between the select statement and the switch statement - the assignment of values to a new variable in a case block. Specifically, if we receive a message from either channel we can assign it to a new variable and use that variable in the case block.
case value := <-someChannel:
// use value here...While the code here is fairly simple, especially if one is already familiar with Go’s select statement, it can enable some very powerful patterns in Go programs.
Sign up for my mailing list and I'll send you a FREE sample from my course - Web Development with Go. The sample includes 19 screencasts and the first few chapters from the book.
You will also receive emails from me about Go coding techniques, upcoming courses (including FREE ones), and course discounts.
Jon Calhoun is a full stack web developer who teaches about Go, web development, algorithms, and anything programming. If you haven't already, you should totally check out his Go courses.
Previously, Jon worked at several statups including co-founding EasyPost, a shipping API used by several fortune 500 companies. Prior to that Jon worked at Google, competed at world finals in programming competitions, and has been programming since he was a child.
Related articles
Spread the word
Did you find this page helpful? Let others know about it!
Sharing helps me continue to create both free and premium Go resources.
Want to discuss the article?
See something that is wrong, think this article could be improved, or just want to say thanks? I'd love to hear what you have to say!
You can reach me via email or via twitter.
©2024 Jonathan Calhoun. All rights reserved.