📖 Scenario: You are building a simple program in Go to understand how concurrency works. You will create a program that runs multiple tasks at the same time and collects their results.
🎯 Goal: Build a Go program that launches multiple concurrent tasks using goroutines, collects their results via channels, and prints the combined output.
📋 What You'll Learn
Create a slice of strings representing tasks
Create a channel to collect results
Launch a goroutine for each task that sends a message to the channel
Collect all messages from the channel and print them
💡 Why This Matters
🌍 Real World
Concurrency is used in real-world programs to run multiple tasks at the same time, like handling many users on a website or processing files in parallel.
💼 Career
Understanding concurrency patterns in Go is important for backend developers, cloud engineers, and anyone building fast, scalable applications.
Progress0 / 4 steps
1
Create a slice of tasks
Create a slice of strings called tasks with these exact values: "task1", "task2", "task3".
Go
Hint
Use []string{} to create a slice with the given strings.
2
Create a channel to collect results
Add a channel called results of type chan string to collect results from goroutines.
Go
Hint
Use make(chan string) to create a channel for strings.
3
Launch goroutines to send results
Use a for loop with variable task to iterate over tasks. Inside the loop, launch a goroutine that sends the string "Completed " + task to the results channel.
Go
Hint
Use a goroutine with a function literal to send the message to the channel.
4
Collect and print all results
Use a for loop to receive exactly 3 messages from the results channel and print each message using println.
Go
Hint
Use a loop to receive from the channel exactly three times and print each message.
Practice
(1/5)
1. What is the primary purpose of a WaitGroup in Go concurrency?
easy
A. To limit the number of goroutines running at the same time
B. To send data safely between goroutines
C. To wait for a collection of goroutines to finish before continuing
D. To create new goroutines
Solution
Step 1: Understand WaitGroup's role
A WaitGroup is used to wait for multiple goroutines to complete their work.
Step 2: Compare with other concurrency tools
Channels send data, semaphores limit concurrency, and goroutines run functions concurrently.
Final Answer:
To wait for a collection of goroutines to finish before continuing -> Option C
Quick Check:
WaitGroup = wait for goroutines [OK]
Hint: WaitGroup waits for goroutines to finish, not for data passing [OK]
Common Mistakes:
Confusing WaitGroup with channels
Thinking WaitGroup limits goroutines
Using WaitGroup to send data
2. Which of the following is the correct syntax to start a new goroutine calling function doWork()?
easy
A. run doWork()
B. goroutine doWork()
C. start doWork()
D. go doWork()
Solution
Step 1: Recall goroutine syntax
In Go, the keyword go before a function call starts it as a goroutine.
Step 2: Check options
Only go doWork() matches the correct syntax; others are invalid keywords.
Final Answer:
go doWork() -> Option D
Quick Check:
Start goroutine with 'go' keyword [OK]
Hint: Start goroutine with 'go' keyword before function call [OK]
Common Mistakes:
Using non-existent keywords like 'goroutine' or 'start'
Omitting 'go' keyword
Trying to run goroutine without parentheses
3. What will be the output of this Go program?
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
fmt.Println("Hello from goroutine 1")
wg.Done()
}()
go func() {
fmt.Println("Hello from goroutine 2")
wg.Done()
}()
wg.Wait()
fmt.Println("All goroutines finished")
}
medium
A. Hello from goroutine 2
Hello from goroutine 1
B. Hello from goroutine 1
Hello from goroutine 2
All goroutines finished
C. Hello from goroutine 1
All goroutines finished
Hello from goroutine 2
D. All goroutines finished
Hello from goroutine 1
Hello from goroutine 2
Solution
Step 1: Understand WaitGroup usage
The program adds 2 to the WaitGroup, then starts 2 goroutines that each print a message and call wg.Done().
Step 2: Analyze output order
The main goroutine waits for both goroutines to finish before printing "All goroutines finished". The two goroutine prints can appear in any order but both appear before the final print.
Final Answer:
Hello from goroutine 1
Hello from goroutine 2
All goroutines finished -> Option B
Quick Check:
WaitGroup ensures final print after goroutines [OK]
Hint: WaitGroup.Wait blocks until all Done calls complete [OK]
Common Mistakes:
Assuming main prints before goroutines
Ignoring WaitGroup synchronization
Expecting goroutine prints after final print
4. Identify the error in this Go code snippet using channels: