📖 Scenario: Imagine you are working with a Go program that uses channels to communicate between goroutines. You want to understand how closing a channel affects sending and receiving data.
🎯 Goal: You will create a channel, send some data, close the channel, and then receive data from it to observe the behavior of a closed channel.
📋 What You'll Learn
Create a channel of type int called ch
Send exactly two integers 10 and 20 into ch
Close the channel ch
Use a for loop with range to receive and print all values from ch
💡 Why This Matters
🌍 Real World
Channels are used in Go programs to safely pass data between concurrent tasks, like workers processing jobs.
💼 Career
Understanding channel closing behavior is essential for writing clean, deadlock-free concurrent Go programs in many software engineering roles.
Progress0 / 4 steps
1
Create a channel
Create a channel called ch of type chan int using make.
Go
Hint
Use make(chan int) to create the channel.
2
Send data and close the channel
Send the integers 10 and 20 into the channel ch using the go keyword and a goroutine. Then close the channel ch after sending the data.
Go
Hint
Use a goroutine with go func() { ... }() to send data and then close the channel.
3
Receive data from the channel
Use a for loop with range to receive all values from the channel ch. Inside the loop, print each received value using fmt.Println. Import the fmt package at the top.
Go
Hint
The range loop automatically stops when the channel is closed.
4
Print the output
Run the program and observe the output. It should print the numbers 10 and 20 each on its own line.
Go
Hint
The program prints the values sent before the channel was closed.
Practice
(1/5)
1. What happens when you close a channel in Go?
easy
A. The channel is deleted from memory immediately
B. Senders can still send values without error
C. Receivers know no more values will be sent
D. The channel blocks all operations permanently
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 C
Quick Check:
close(channel) signals receivers [OK]
Hint: Closing signals receivers no more data comes [OK]
Common Mistakes:
Thinking senders can send after close
Believing channel is deleted immediately
Assuming channel blocks forever after close
2. Which of the following is the correct way to close a channel named ch in Go?
easy
A. ch.Close()
B. ch.close()
C. close channel ch
D. close(ch)
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 D
Quick Check:
Use close(channel) syntax [OK]
Hint: Use built-in close(channel) function [OK]
Common Mistakes:
Trying to call close as a method
Using incorrect keywords like 'close channel'
Capitalizing close as Close
3. What is the output of this Go program?
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 10
ch <- 20
close(ch)
for v := range ch {
fmt.Print(v, " ")
}
}
medium
A. 10 20
B. 10 20 0
C. Runtime panic: send on closed channel
D. No output
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 A
Quick Check:
Range over closed channel prints buffered values [OK]
Hint: Range prints all buffered values before stopping [OK]
Common Mistakes:
Expecting panic on reading closed channel
Thinking zero value prints after buffered values
Assuming no output because channel is closed
4. Identify the error in this Go code snippet:
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)
}
medium
A. Channel is unbuffered but sender is in goroutine, no deadlock
B. No error, code runs and prints 0 1 2
C. Closing channel inside goroutine causes panic
D. Receiver loop never ends, causing infinite loop
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 B
Quick Check:
Proper close and ok check ends loop [OK]
Hint: Use ok to detect closed channel and break loop [OK]
Common Mistakes:
Thinking closing in goroutine causes panic
Assuming infinite loop without break
Ignoring need to check ok when receiving
5. Consider this Go program:
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?
hard
A. 2
Only even numbers printed before channel closes
B. 1
2
3
All numbers printed despite channel closing
C. No output because channel is closed before reading
D. Runtime panic due to sending on closed channel
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 A
Quick Check:
Filter with condition inside loop after close [OK]
Hint: Filter values after reading until channel closes [OK]
Common Mistakes:
Expecting all values printed
Thinking channel closes before sending
Assuming panic on close with goroutine sender
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.