Channel closing behavior in Go - Time & Space Complexity
When working with channels in Go, it's important to understand how closing a channel affects the program's speed.
We want to see how the time to close and read from a channel changes as the number of messages grows.
Analyze the time complexity of the following code snippet.
ch := make(chan int, n)
for i := 0; i < n; i++ {
ch <- i
}
close(ch)
for v := range ch {
_ = v
}
This code fills a channel with n integers, closes it, then reads all values until the channel is empty.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Sending and receiving values in a loop over n items.
- How many times: Each loop runs n times, once for each item.
As the number of items n increases, the total operations increase proportionally.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 (10 sends + 10 receives) |
| 100 | About 200 (100 sends + 100 receives) |
| 1000 | About 2000 (1000 sends + 1000 receives) |
Pattern observation: The work grows linearly with the number of items sent and received.
Time Complexity: O(n)
This means the time to send, close, and receive all items grows directly with the number of items.
[X] Wrong: "Closing a channel instantly empties it, so reading after close is free."
[OK] Correct: Even after closing, you must receive each item one by one, so reading still takes time proportional to the number of items.
Understanding how channel operations scale helps you write efficient concurrent programs and explain your reasoning clearly in interviews.
"What if we replaced the buffered channel with an unbuffered channel? How would the time complexity change?"
Practice
Solution
Step 1: Understand channel closing purpose
Closing a channel signals receivers that no more values will be sent.Step 2: Effects on senders and receivers
Senders cannot send after closing; receivers get zero value and ok=false.Final Answer:
Receivers know no more values will be sent -> Option CQuick Check:
close(channel) signals receivers [OK]
- Thinking senders can send after close
- Believing channel is deleted immediately
- Assuming channel blocks forever after close
ch in Go?Solution
Step 1: Recall Go syntax for closing channels
The built-in function close() is used with the channel as argument.Step 2: Identify correct syntax
Only close(ch) is valid; methods like ch.close() or ch.Close() do not exist.Final Answer:
close(ch) -> Option DQuick Check:
Use close(channel) syntax [OK]
- Trying to call close as a method
- Using incorrect keywords like 'close channel'
- Capitalizing close as Close
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 10
ch <- 20
close(ch)
for v := range ch {
fmt.Print(v, " ")
}
}Solution
Step 1: Understand channel buffering and closing
Channel has buffer size 2, two values sent, then channel closed.Step 2: Loop over channel with range
Range reads all values until channel is closed and drained, printing 10 and 20.Final Answer:
10 20 -> Option AQuick Check:
Range over closed channel prints buffered values [OK]
- Expecting panic on reading closed channel
- Thinking zero value prints after buffered values
- Assuming no output because channel is closed
ch := make(chan int)
go func() {
for i := 0; i < 3; i++ {
ch <- i
}
close(ch)
}()
for {
v, ok := <-ch
if !ok {
break
}
fmt.Println(v)
}Solution
Step 1: Analyze channel usage and goroutine
Unbuffered channel with sender in goroutine sends 3 values then closes channel.Step 2: Check receiver loop behavior
Receiver reads values until channel closes, then breaks loop correctly.Final Answer:
No error, code runs and prints 0 1 2 -> Option BQuick Check:
Proper close and ok check ends loop [OK]
- Thinking closing in goroutine causes panic
- Assuming infinite loop without break
- Ignoring need to check ok when receiving
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
for i := 1; i <= 3; i++ {
ch <- i
}
close(ch)
}()
for {
v, ok := <-ch
if !ok {
break
}
if v%2 == 0 {
fmt.Println(v)
}
}
}
What is the output and why?Solution
Step 1: Understand sending and closing in goroutine
Values 1, 2, 3 sent then channel closed properly.Step 2: Receiver loop filters even numbers
Loop reads until closed; prints only values where v%2 == 0, which is 2.Final Answer:
2 Only even numbers printed before channel closes -> Option AQuick Check:
Filter with condition inside loop after close [OK]
- Expecting all values printed
- Thinking channel closes before sending
- Assuming panic on close with goroutine sender
Ready to prove it?
Pass the test and this pattern moves unknown
