Channels let goroutines talk to each other. Closing a channel tells others no more values will come.
Channel closing behavior in Go
close(channelName)
You only close a channel from the sender side.
Closing a channel twice causes a panic (runtime error).
ch := make(chan int)
close(ch)for v := range ch {
fmt.Println(v)
}v, ok := <-ch if !ok { fmt.Println("Channel closed, no more data") }
This program sends numbers 1 to 3 into a channel, then closes it. The main goroutine reads and prints all values until the channel closes. Then it tries to read once more to show the zero value and ok=false after closing.
package main import ( "fmt" ) func main() { ch := make(chan int) go func() { for i := 1; i <= 3; i++ { ch <- i } close(ch) }() for v := range ch { fmt.Println(v) } v, ok := <-ch fmt.Printf("After close: value=%d, ok=%v\n", v, ok) }
Do not send on a closed channel; it causes a panic.
Receivers can detect channel closure by checking the second value from receive.
Closing a channel is optional but useful to signal no more data.
Use close(channel) to tell receivers no more values will come.
Reading from a closed channel returns zero value and ok=false.
Looping with for v := range channel stops when channel closes.
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
