Bird
Raised Fist0
Goprogramming~20 mins

Why select is needed in Go - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Go Select Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Go program using select?

Consider this Go program that uses select to wait on multiple channels. What will it print?

Go
package main

import (
	"fmt"
	"time"
)

func main() {
	ch1 := make(chan string)
	ch2 := make(chan string)

	go func() {
		time.Sleep(100 * time.Millisecond)
		ch1 <- "from ch1"
	}()

	go func() {
		time.Sleep(50 * time.Millisecond)
		ch2 <- "from ch2"
	}()

	select {
	case msg1 := <-ch1:
		fmt.Println(msg1)
	case msg2 := <-ch2:
		fmt.Println(msg2)
	}
}
Afrom ch1
BProgram deadlocks
CCompilation error
Dfrom ch2
Attempts:
2 left
💡 Hint

Think about which goroutine sends data first and how select picks the ready channel.

🧠 Conceptual
intermediate
1:30remaining
Why is select needed in Go concurrency?

Which of the following best explains why the select statement is needed in Go?

ATo lock multiple channels at once to prevent race conditions.
BTo create new goroutines automatically without explicit calls.
CTo allow a goroutine to wait on multiple channel operations simultaneously and proceed with the one that is ready first.
DTo convert channels into buffered queues.
Attempts:
2 left
💡 Hint

Think about how Go handles multiple channel communications at the same time.

🔧 Debug
advanced
2:00remaining
What error does this Go code cause and why?

Examine this Go code snippet using select. What error will it produce when run?

Go
package main

func main() {
	ch := make(chan int)

	select {
	case val := <-ch:
		println(val)
	}
}
ADeadlock error because no goroutine sends data to the channel.
BCompilation error due to missing default case in select.
CRuntime panic due to nil channel.
DNo error; program prints 0 and exits.
Attempts:
2 left
💡 Hint

Think about what happens when a goroutine waits to receive from a channel with no sender.

❓ Predict Output
advanced
2:00remaining
What is the output of this Go program with multiple select cases?

What will this Go program print?

Go
package main

import (
	"fmt"
	"time"
)

func main() {
	ch1 := make(chan string)
	ch2 := make(chan string)

	go func() {
		ch1 <- "hello"
	}()

	go func() {
		ch2 <- "world"
	}()

	select {
	case msg := <-ch1:
		fmt.Println(msg)
	case msg := <-ch2:
		fmt.Println(msg)
	default:
		fmt.Println("no message received")
	}
}
Aworld
Bno message received
CProgram deadlocks
Dhello
Attempts:
2 left
💡 Hint

Consider the timing of goroutines and the default case in select.

🧠 Conceptual
expert
2:30remaining
Why does Go's select statement improve concurrency control?

Which statement best describes how Go's select improves concurrency control compared to blocking on a single channel?

A<p><code>select</code> enables a goroutine to handle multiple communication events without blocking indefinitely on one, improving responsiveness and avoiding deadlocks.</p>
B<p><code>select</code> automatically balances load between goroutines by redistributing channel messages.</p>
C<p><code>select</code> serializes all channel operations to ensure strict ordering of messages.</p>
D<p><code>select</code> replaces mutexes by locking channels during communication.</p>
Attempts:
2 left
💡 Hint

Think about how waiting on multiple channels helps a goroutine stay active.

Practice

(1/5)
1. Why do we need the select statement in Go when working with channels?
easy
A. To convert channels into slices
B. To create new channels dynamically
C. To wait on multiple channels and handle whichever is ready first
D. To close channels safely

Solution

  1. Step 1: Understand the purpose of select

    The select statement allows a Go program to wait on multiple channel operations simultaneously.
  2. Step 2: Identify what select does

    It picks the first channel that is ready to send or receive and executes the corresponding code block.
  3. Final Answer:

    To wait on multiple channels and handle whichever is ready first -> Option C
  4. Quick Check:

    select waits on many channels = D [OK]
Hint: Remember: select waits on many channels at once [OK]
Common Mistakes:
  • Thinking select creates or closes channels
  • Confusing select with channel creation syntax
  • Assuming select converts channels to other types
2. Which of the following is the correct syntax to start a select block in Go?
easy
A. for { case <-ch1: ... case <-ch2: ... }
B. switch { case <-ch1: ... case <-ch2: ... }
C. if { case <-ch1: ... case <-ch2: ... }
D. select { case <-ch1: ... case <-ch2: ... }

Solution

  1. Step 1: Recall the syntax for select

    The select statement uses curly braces and multiple case clauses for channels.
  2. Step 2: Match the correct syntax

    select { case <-ch1: ... case <-ch2: ... } correctly shows select { case <-ch1: ... case <-ch2: ... }, which is valid Go syntax.
  3. Final Answer:

    select { case <-ch1: ... case <-ch2: ... } -> Option D
  4. Quick Check:

    Correct select syntax = A [OK]
Hint: Select uses 'select { case ... }' syntax, not switch or if [OK]
Common Mistakes:
  • Using switch instead of select for channels
  • Trying to use if with case clauses
  • Using for loop syntax for select
3. What will be the output of this Go program?
package main
import (
  "fmt"
  "time"
)
func main() {
  ch1 := make(chan string)
  ch2 := make(chan string)
  go func() { ch1 <- "hello" }()
  go func() {
    time.Sleep(10 * time.Millisecond)
    ch2 <- "world"
  }()
  select {
  case msg1 := <-ch1:
    fmt.Println(msg1)
  case msg2 := <-ch2:
    fmt.Println(msg2)
  }
}
medium
A. hello
B. world
C. hello world
D. No output, program deadlocks

Solution

  1. Step 1: Understand the goroutines sending to channels

    Two goroutines send "hello" to ch1 and "world" to ch2 concurrently.
  2. Step 2: Analyze the select statement behavior

    The select picks the first channel ready to receive. The ch1 goroutine sends immediately while the ch2 goroutine sleeps for 10ms before sending, so ch1 is ready first, printing "hello".
  3. Final Answer:

    hello -> Option A
  4. Quick Check:

    Select picks first ready channel = hello [OK]
Hint: Select prints first ready channel message only [OK]
Common Mistakes:
  • Expecting both messages printed
  • Thinking select waits for all channels
  • Assuming program deadlocks without buffering
4. Identify the error in this Go code using select:
package main
func main() {
  ch := make(chan int)
  select {
  case val := <-ch:
    println(val)
  default:
    println("No value")
  }
}
medium
A. The channel ch is not closed, causing a deadlock
B. The code is correct and prints "No value" immediately
C. The select statement must have at least two cases with channels
D. The default case is not allowed in select

Solution

  1. Step 1: Understand select with default case

    If no channel is ready, the default case runs immediately without blocking.
  2. Step 2: Analyze the code behavior

    Since ch is empty and no send occurs, the receive case blocks, so default prints "No value".
  3. Final Answer:

    The code is correct and prints "No value" immediately -> Option B
  4. Quick Check:

    Select with default runs default if no channel ready = C [OK]
Hint: Default case runs immediately if no channel ready [OK]
Common Mistakes:
  • Thinking code deadlocks without channel close
  • Believing select needs multiple channel cases
  • Assuming default case is forbidden
5. You want to read from two channels ch1 and ch2 and process whichever sends data first. How does using select help in this scenario?
medium
A. It lets you wait on both channels simultaneously and handle the first ready one without blocking on the other
B. It merges both channels into one automatically
C. It queues messages from both channels and processes them in order
D. It duplicates messages from one channel to the other

Solution

  1. Step 1: Understand the problem of waiting on multiple channels

    Without select, you would block waiting on one channel and miss data from the other.
  2. Step 2: Explain how select solves this

    select waits on both channels at once and runs the code for whichever channel sends data first, making the program responsive.
  3. Final Answer:

    It lets you wait on both channels simultaneously and handle the first ready one without blocking on the other -> Option A
  4. Quick Check:

    Select waits on many channels and picks first ready = A [OK]
Hint: Select handles multiple channels without blocking others [OK]
Common Mistakes:
  • Thinking select merges or queues channels automatically
  • Assuming select duplicates messages
  • Believing select processes channels sequentially
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard