Bird
Raised Fist0
Goprogramming~10 mins

Select with multiple channels in Go - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to receive a value from channel c1.

Go
select {
case msg := <-[1]:
    fmt.Println("Received", msg)
}
Drag options to blanks, or click blank then click option'
Anil
Bc1
Cdone
Dc2
Attempts:
3 left
💡 Hint
Common Mistakes
Using the wrong channel name in the receive expression.
Trying to receive from a closed or nil channel.
2fill in blank
medium

Complete the code to send the string "hello" to channel c2 inside the select.

Go
select {
case [1] <- "hello":
    fmt.Println("Sent hello")
}
Drag options to blanks, or click blank then click option'
Ac2
Bc1
Cmsg
Ddone
Attempts:
3 left
💡 Hint
Common Mistakes
Putting the value before the arrow instead of the channel.
Using a variable name instead of the channel.
3fill in blank
hard

Fix the error in the select statement to correctly receive from channel done.

Go
select {
case <-[1]:
    fmt.Println("Done signal received")
}
Drag options to blanks, or click blank then click option'
Adone
Bc2
Cc1
Dmsg
Attempts:
3 left
💡 Hint
Common Mistakes
Using a variable name instead of the channel.
Trying to assign the received value when none is sent.
4fill in blank
hard

Fill both blanks to receive from c1 and send "ok" to c2 inside the select.

Go
select {
case msg := <-[1]:
    fmt.Println("Received", msg)
case [2] <- "ok":
    fmt.Println("Sent ok")
}
Drag options to blanks, or click blank then click option'
Ac1
Bc2
Cdone
Dmsg
Attempts:
3 left
💡 Hint
Common Mistakes
Mixing up send and receive channels.
Using variable names instead of channel names.
5fill in blank
hard

Fill all three blanks to receive from c1, send "done" to c2, and receive from done channel.

Go
select {
case msg := <-[1]:
    fmt.Println("Received", msg)
case [2] <- "done":
    fmt.Println("Sent done")
case <-[3]:
    fmt.Println("Done signal received")
}
Drag options to blanks, or click blank then click option'
Ac1
Bc2
Cdone
Dmsg
Attempts:
3 left
💡 Hint
Common Mistakes
Confusing send and receive operations.
Using variable names instead of channel names.

Practice

(1/5)
1.

What does the select statement do when used with multiple channels in Go?

easy
A. It waits until one of the channels is ready to send or receive and executes that case.
B. It executes all channel operations simultaneously regardless of readiness.
C. It blocks forever until all channels are ready at the same time.
D. It randomly picks a channel to operate on without checking readiness.

Solution

  1. Step 1: Understand select behavior

    The select statement waits for one of its channel cases to be ready.
  2. Step 2: Identify how select chooses a case

    It picks one of the channels that is ready to send or receive and runs that case.
  3. Final Answer:

    It waits until one of the channels is ready to send or receive and executes that case. -> Option A
  4. Quick Check:

    Select waits for ready channel = A [OK]
Hint: Select picks the first ready channel to act on [OK]
Common Mistakes:
  • Thinking select runs all channels at once
  • Believing select waits for all channels simultaneously
  • Assuming select picks channels randomly without readiness check
2.

Which of the following is the correct syntax to use select with two channels ch1 and ch2 for receiving values?

?
easy
A. select { case val = <-ch1: fmt.Println(val) case val = <-ch2: fmt.Println(val) }
B. select { case <-ch1: fmt.Println(val) case <-ch2: fmt.Println(val) }
C. select { case val := ch1: fmt.Println(val) case val := ch2: fmt.Println(val) }
D. select { case val := <-ch1: fmt.Println(val) case val := <-ch2: fmt.Println(val) }

Solution

  1. Step 1: Check channel receive syntax

    Receiving from a channel uses val := <-ch to assign the received value.
  2. Step 2: Verify select case syntax

    Each case must have a receive operation with assignment like val := <-ch1.
  3. Final Answer:

    select { case val := <-ch1: fmt.Println(val) case val := <-ch2: fmt.Println(val) } -> Option D
  4. Quick Check:

    Correct receive syntax uses := <-channel [OK]
Hint: Use := <-channel to receive inside select case [OK]
Common Mistakes:
  • Using = instead of := for assignment
  • Omitting the <- operator for receiving
  • Trying to assign channel itself instead of received value
3.

What will be the output of the following Go program?

package main
import (
    "fmt"
    "time"
)
func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)
    go func() {
        time.Sleep(100 * time.Millisecond)
        ch1 <- "hello"
    }()
    go func() {
        time.Sleep(50 * 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 (deadlock)

Solution

  1. Step 1: Analyze goroutine sleep durations

    The goroutine sending to ch2 sleeps 50ms, and ch1 sleeps 100ms.
  2. Step 2: Determine which channel is ready first

    Since ch2 sends first, the select will receive from ch2 and print "world".
  3. Final Answer:

    world -> Option B
  4. Quick Check:

    Channel with shorter sleep sends first = world [OK]
Hint: Select picks channel ready first (shorter sleep) [OK]
Common Mistakes:
  • Assuming ch1 sends first because it is listed first
  • Expecting both messages to print
  • Thinking select waits for all channels
4.

Identify the error in this Go code using select with multiple channels:

package main
import "fmt"
func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)
    select {
    case val := <-ch1:
        fmt.Println(val)
    case val := <-ch2:
        fmt.Println(val)
    }
}
medium
A. Channels must be buffered to use select.
B. The select statement syntax is invalid without a loop.
C. The program will deadlock because channels are never written to.
D. The default case is not allowed in select statements.

Solution

  1. Step 1: Analyze channel creation

    Channels ch1 and ch2 are unbuffered with no goroutines to send values.
  2. Step 2: Select behavior without senders

    The select blocks forever since no channels become ready, causing a deadlock.
  3. Final Answer:

    The program will deadlock because channels are never written to. -> Option C
  4. Quick Check:

    No senders + no default = deadlock [OK]
Hint: No senders and no default causes deadlock [OK]
Common Mistakes:
  • Thinking channels must be buffered to use select
  • Believing select syntax is invalid without a loop
  • Assuming a default case is required or invalid
5.

You want to write a Go function that waits on two channels chA and chB and returns the first value received from either. If neither channel is ready immediately, it should return "timeout" after 100 milliseconds. Which select structure correctly implements this?

hard
A. select { case val := <-chA: return val case val := <-chB: return val case <-time.After(100 * time.Millisecond): return "timeout" }
B. select { case val := <-chA: return val case val := <-chB: return val default: time.Sleep(100 * time.Millisecond) return "timeout" }
C. select { case val := <-chA: return val case val := <-chB: return val case <-time.Tick(100 * time.Millisecond): return "timeout" }
D. select { case val := <-chA: return val case val := <-chB: return val case <-time.After(100): return "timeout" }

Solution

  1. Step 1: Use time.After for timeout

    The time.After function returns a channel that sends a value after the specified duration, perfect for timeout.
  2. Step 2: Check select cases

    Cases for receiving from chA and chB return the first received value; the timeout case returns "timeout" after 100ms.
  3. Step 3: Validate other options

    select { case val := <-chA: return val case val := <-chB: return val default: time.Sleep(100 * time.Millisecond) return "timeout" } uses default with sleep which blocks select; select { case val := <-chA: return val case val := <-chB: return val case <-time.Tick(100 * time.Millisecond): return "timeout" } uses time.Tick which repeats; select { case val := <-chA: return val case val := <-chB: return val case <-time.After(100): return "timeout" } uses incorrect duration type.
  4. Final Answer:

    select { case val := <-chA: return val case val := <-chB: return val case <-time.After(100 * time.Millisecond): return "timeout" } -> Option A
  5. Quick Check:

    Use time.After channel for timeout in select [OK]
Hint: Use time.After channel for timeout in select [OK]
Common Mistakes:
  • Using default with sleep instead of time.After
  • Using time.Tick which repeats instead of time.After
  • Passing wrong duration type to time.After
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