📖 Scenario: You are building a simple Go program where two goroutines need to coordinate their actions using channels. This is like two friends passing notes to each other to stay in sync.
🎯 Goal: Create a Go program that uses a channel to synchronize two goroutines. One goroutine will send a message, and the other will wait to receive it before printing it.
📋 What You'll Learn
Create a channel of type string called messageChan
Start a goroutine named sender that sends the string "Hello from sender" into messageChan
Start a goroutine named receiver that receives from messageChan and stores the value in a variable called msg
Print the received message msg in the receiver goroutine
Use sync.WaitGroup to wait for both goroutines to finish before the main function exits
💡 Why This Matters
🌍 Real World
Channels and goroutines are used in Go to build fast and efficient programs that do many things at once, like web servers or data processors.
💼 Career
Understanding channel synchronization is important for Go developers working on concurrent applications, ensuring safe communication between parts of a program.
Progress0 / 4 steps
1
Create the channel
Create a channel of type string called messageChan using make.
Go
Hint
Use make(chan string) to create the channel.
2
Add a WaitGroup and start sender goroutine
Import sync. Create a sync.WaitGroup called wg. Add 2 to wg. Start a goroutine named sender that sends the string "Hello from sender" into messageChan and calls wg.Done() when finished.
Go
Hint
Use wg.Add(2) before starting goroutines. Use defer wg.Done() inside the goroutine.
3
Start receiver goroutine to receive and print message
Start a goroutine named receiver that receives from messageChan into a variable called msg. Then print msg. Call wg.Done() when finished.
Go
Hint
Use msg := <-messageChan to receive from the channel.
4
Wait for goroutines to finish
Add wg.Wait() at the end of main to wait for both goroutines to finish before exiting.
Go
Hint
Use wg.Wait() to wait for all goroutines to finish.
Practice
(1/5)
1. What happens when a goroutine tries to send data on an unbuffered channel if no other goroutine is ready to receive?
easy
A. The sending goroutine waits until another goroutine receives the data.
B. The data is lost and the program continues immediately.
C. The program crashes with a runtime error.
D. The data is buffered automatically for later use.
Solution
Step 1: Understand unbuffered channel behavior
Unbuffered channels require both sender and receiver to be ready at the same time for communication.
Step 2: Analyze sending on unbuffered channel
If no goroutine is ready to receive, the sending goroutine blocks and waits until a receiver is ready.
Final Answer:
The sending goroutine waits until another goroutine receives the data. -> Option A
Quick Check:
Unbuffered channel send blocks until receive [OK]
Hint: Unbuffered sends block until a receiver is ready [OK]
Common Mistakes:
Thinking data is buffered automatically
Assuming send never blocks
Believing program crashes on send
2. Which of the following is the correct syntax to create a buffered channel of integers with capacity 3 in Go?
easy
A. ch := chan int{3}
B. ch := make(chan int)
C. ch := make(chan int, 3)
D. ch := new(chan int, 3)
Solution
Step 1: Recall channel creation syntax
Channels are created using make with type and optional buffer size: make(chan Type, capacity).
Step 2: Identify correct buffered channel syntax
To create a buffered channel of int with capacity 3, use make(chan int, 3).
A goroutine sends "hello" on an unbuffered channel ch, while main receives from ch.
Step 2: Understand synchronization
The send and receive synchronize, so main receives "hello" and prints it.
Final Answer:
hello -> Option D
Quick Check:
Send and receive synchronize, printing message [OK]
Hint: Unbuffered channel send/receive synchronize to pass data [OK]
Common Mistakes:
Expecting deadlock because of goroutine
Thinking channel is buffered by default
Assuming no output due to concurrency
4. Identify the error in this Go code snippet involving channel synchronization:
package main
func main() {
ch := make(chan int)
ch <- 5
val := <-ch
println(val)
}
medium
A. No error, code runs fine.
B. Sending on channel blocks forever causing deadlock.
C. Channel is not initialized properly.
D. Receiving from channel blocks forever causing deadlock.
Solution
Step 1: Check channel creation and usage
Channel ch is unbuffered and created correctly with make(chan int).
Step 2: Analyze send operation
Sending on unbuffered channel blocks until another goroutine receives. Here, send happens before receive, no other goroutine receives, so it blocks forever.
Final Answer:
Sending on channel blocks forever causing deadlock. -> Option B
Quick Check:
Send blocks without concurrent receiver [OK]
Hint: Send on unbuffered channel blocks if no receiver ready [OK]
Common Mistakes:
Thinking receive blocks first
Assuming channel is nil
Believing code runs without deadlock
5. You want to run three tasks concurrently and wait for all to finish before exiting. Which Go code snippet correctly uses channels to synchronize all tasks?
hard
A. Use a buffered channel with capacity 3; each goroutine sends a signal when done; main receives 3 signals.
B. Use an unbuffered channel; main sends signals to goroutines to start; no synchronization on finish.
C. Use a buffered channel with capacity 1; goroutines send signals; main receives once.
D. Use no channels; just start goroutines and exit main immediately.
Solution
Step 1: Understand synchronization goal
Main must wait for all 3 goroutines to finish before exiting.
Step 2: Analyze channel usage options
Buffered channel with capacity 3 allows all goroutines to send done signals without blocking; main receives 3 signals to know all finished.
Final Answer:
Use a buffered channel with capacity 3; each goroutine sends a signal when done; main receives 3 signals. -> Option A
Quick Check:
Buffered channel capacity = number of goroutines to sync [OK]
Hint: Use buffered channel sized to goroutines for sync signals [OK]
Common Mistakes:
Using unbuffered channel causing deadlock
Receiving fewer signals than goroutines
Not waiting for goroutines at all
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.