The default case in a select statement lets your program do something when no other channel is ready. It helps avoid waiting forever.
Default case in select in Go
select {
case <-chan1:
// do something when chan1 is ready
case chan2 <- value:
// send value when chan2 is ready
default:
// do this if no channels are ready
}The default case runs immediately if no other case can proceed.
Without default, select waits (blocks) until a channel is ready.
ch1. If no message is ready, it prints a fallback message.select {
case msg := <-ch1:
fmt.Println("Received", msg)
default:
fmt.Println("No message ready")
}ch2. If ch2 is not ready to receive, it prints a fallback message.select {
case ch2 <- 10:
fmt.Println("Sent 10 to ch2")
default:
fmt.Println("Could not send to ch2")
}This program tries to receive a message from ch. If no message is ready, it prints a message and waits a bit. After 1 second, the goroutine sends "hello" to ch, so the next select receives it.
package main import ( "fmt" "time" ) func main() { ch := make(chan string) go func() { time.Sleep(1 * time.Second) ch <- "hello" }() for i := 0; i < 3; i++ { select { case msg := <-ch: fmt.Println("Received message:", msg) default: fmt.Println("No message yet, doing other work") time.Sleep(500 * time.Millisecond) } } }
Use default to keep your program from freezing when channels are empty.
Without default, select waits until one channel is ready.
Be careful: too many default cases can cause busy loops that waste CPU.
The default case runs if no channels are ready in a select.
It helps avoid blocking and keeps your program responsive.
Use it for fallback actions or to do other work while waiting.
Practice
What does the default case do in a Go select statement?
Solution
Step 1: Understand the role of
Theselectselectstatement waits on multiple channel operations.Step 2: Identify the purpose of
Thedefaultdefaultcase runs immediately if no channels are ready, preventing blocking.Final Answer:
Runs immediately if no other channel operations are ready -> Option CQuick Check:
defaultruns when no channels ready = A [OK]
- Thinking default blocks until a channel is ready
- Assuming default closes channels
- Believing default sends data to all channels
Which of the following is the correct syntax for using a default case in a Go select?
select {
case msg := <-ch1:
fmt.Println(msg)
// What goes here?
}Solution
Step 1: Recall Go
Theselectsyntaxdefaultkeyword is used for the fallback case inselect.Step 2: Match correct keyword
Onlydefaultis valid;else,fallback, andotherwiseare invalid in Goselect.Final Answer:
default: fmt.Println("No message received") -> Option AQuick Check:
Usedefaultkeyword in select = C [OK]
- Using else instead of default
- Trying fallback or otherwise keywords
- Omitting the colon after default
What will be the output of this Go program?
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
select {
case msg := <-ch:
fmt.Println(msg)
default:
fmt.Println("No message received")
}
}Solution
Step 1: Analyze channel state
The channelchis created but no data is sent, so it's empty and no receive is ready.Step 2: Understand select with default
Since no data is ready onch, thedefaultcase runs immediately, printing "No message received".Final Answer:
No message received -> Option DQuick Check:
No data ready triggers default = A [OK]
- Expecting program to block waiting for channel
- Thinking empty string is printed
- Assuming compilation error due to empty channel
Identify the error in this Go code snippet using select with a default case:
select {
case msg := <-ch:
fmt.Println(msg)
default
fmt.Println("No message")
}Solution
Step 1: Check
Thedefaultsyntaxdefaultcase requires a colon (:) after the keyword.Step 2: Identify missing colon
The code hasdefaultwithout a colon, causing a syntax error.Final Answer:
Missing colon after default keyword -> Option BQuick Check:
Default needs colon (:) = D [OK]
- Forgetting colon after default
- Assuming default must be last case
- Confusing variable scope in select
Consider this Go program snippet:
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
time.Sleep(100 * time.Millisecond)
ch1 <- 1
}()
go func() {
time.Sleep(200 * time.Millisecond)
ch2 <- 2
}()
select {
case val := <-ch1:
fmt.Println("Received from ch1:", val)
case val := <-ch2:
fmt.Println("Received from ch2:", val)
default:
fmt.Println("No channels ready")
}What is the most likely output when this select runs?
Solution
Step 1: Understand goroutine timing
The goroutines send to channels after 100ms and 200ms delays, but theselectruns immediately.Step 2: Check channel readiness at select
At the momentselectruns, neither channel has data ready, so no case is ready.Step 3: Default case triggers
Because no channels are ready, thedefaultcase runs, printing "No channels ready".Final Answer:
No channels ready -> Option AQuick Check:
Default runs if no channel ready = B [OK]
- Assuming select waits for channels
- Expecting output from ch1 or ch2 immediately
- Thinking program deadlocks without default
Ready to prove it?
Pass the test and this pattern moves unknown
