Go select with Default 🎯

beginner
13 min

Go select with Default 🎯

Welcome to our comprehensive guide on Go select with Default! In this tutorial, we'll dive deep into one of Go's powerful concurrency features. By the end of this lesson, you'll be able to manage multiple concurrent tasks efficiently. Let's get started!

What is select with Default? 📝

Go's select statement allows multiple cases to be selected from for communication between concurrent goroutines. The default case is optional and will execute if no other case can run.

Why use select with Default? 💡

select with default is useful when we want to avoid blocking a goroutine, allowing it to continue running even if a particular communication channel is not ready to be read or written.

A Simple Example 📝

Let's start with a simple example to illustrate the concept:

go
package main import ( "fmt" "time" ) func main() { ch1 := make(chan int) ch2 := make(chan int) go func() { time.Sleep(3 * time.Second) fmt.Println("Sending data to ch1...") ch1 <- 1 }() go func() { time.Sleep(2 * time.Second) fmt.Println("Sending data to ch2...") ch2 <- 2 }() for { select { case msg1 := <-ch1: fmt.Println("Received data from ch1:", msg1) close(ch1) break case msg2 := <-ch2: fmt.Println("Received data from ch2:", msg2) close(ch2) break default: fmt.Println("No data received yet.") time.Sleep(100 * time.Millisecond) } } }

In this example, we have two channels ch1 and ch2, and two goroutines that will send data to these channels after a delay. The select statement allows us to wait for data from either channel. If data arrives, we print it and close the channel. If no data arrives, we simply wait a bit and try again.

A More Practical Example 🎯

Now, let's consider a more practical example where we have multiple concurrent HTTP requests and want to wait for the first response without blocking the other requests:

go
package main import ( "fmt" "io/ioutil" "net/http" "sync" "time" ) func main() { urls := []string{ "https://example.com/a", "https://example.com/b", "https://example.com/c", } wg := sync.WaitGroup{} results := make(chan string) go func() { for _, url := range urls { wg.Add(1) go func(url string) { defer wg.Done() resp, err := http.Get(url) if err != nil { fmt.Println("Error:", err) return } body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error:", err) return } results <- string(body) }(url) } }() go func() { for res := range results { fmt.Println("Received response:", res) break } }() wg.Wait() close(results) }

In this example, we have multiple concurrent HTTP requests to different URLs. The select statement with default allows us to continue waiting for responses even if one or more requests take longer than others.

Quiz 💡

Quick Quiz
Question 1 of 1

What does Go's select with Default statement do?

Wrapping Up 🎯

We've covered the basics of Go's select statement with default, and learned how it can be used to manage concurrent tasks efficiently. Go's select with default is an essential tool in your concurrency toolbox, allowing you to write powerful and scalable concurrent programs.

Happy coding! 💡🎯