Concurrency lets a program do many things at the same time. This helps it work faster and handle many tasks without waiting for one to finish before starting another.
When you want to download multiple files at once without waiting for each to finish.
When a program needs to listen for user input while also doing background work.
When you want to handle many users connecting to a server at the same time.
When you want to keep a program responsive while doing slow tasks like reading from disk.
When you want to split a big job into smaller parts that run together to finish faster.
Syntax
Go
go func() {
// code to run concurrently
}()
In Go, concurrency is often done using goroutines, which are lightweight threads.
The keyword go starts a new goroutine to run the function concurrently.
Examples
This starts a new goroutine that prints a message without blocking the main program.
Go
go func() {
println("Hello from a goroutine")
}()
This runs the doWork function concurrently using a goroutine.
Go
go doWork()
func doWork() {
println("Working concurrently")
}
Sample Program
This program runs say("Hello") in a new goroutine while say("World") runs in the main goroutine. You see messages from both at the same time.
Go
package main
import (
"fmt""time"
)
func say(message string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(message)
}
}
func main() {
go say("Hello")
say("World")
time.Sleep(500 * time.Millisecond) // Added to allow goroutine to finish
}
OutputSuccess
Important Notes
Goroutines are very cheap and easy to create compared to traditional threads.
Without concurrency, programs wait for one task to finish before starting another, which can be slow.
Concurrency helps programs stay responsive and use resources efficiently.
Summary
Concurrency lets programs do many things at once.
Go uses goroutines to run code concurrently.
This makes programs faster and more responsive.
Practice
(1/5)
1. Why do we need concurrency in Go programs?
easy
A. To simplify the code by removing all loops and conditions.
B. To allow multiple tasks to run at the same time, improving speed and responsiveness.
C. To make the program use less memory by running tasks one after another.
D. To avoid using functions and write everything in the main block.
Solution
Step 1: Understand concurrency purpose
Concurrency allows a program to handle multiple tasks at once instead of waiting for one to finish before starting another.
Step 2: Relate concurrency to Go
Go uses goroutines to run tasks concurrently, which helps programs be faster and more responsive.
Final Answer:
To allow multiple tasks to run at the same time, improving speed and responsiveness. -> Option B
Quick Check:
Concurrency = multiple tasks at once [OK]
Hint: Concurrency means doing many things at once [OK]
Common Mistakes:
Thinking concurrency reduces memory by running tasks sequentially
Confusing concurrency with simpler code structure
Believing concurrency removes the need for functions
2. Which of the following is the correct way to start a goroutine in Go?
easy
A. go myFunction()
B. start myFunction()
C. run myFunction()
D. goroutine myFunction()
Solution
Step 1: Recall Go syntax for goroutines
In Go, the keyword go is used before a function call to start it as a goroutine.
Step 2: Check each option
Only go myFunction() uses the correct go keyword syntax; others are invalid in Go.
Final Answer:
go myFunction() -> Option A
Quick Check:
Start goroutine with 'go' keyword [OK]
Hint: Use 'go' before function to start goroutine [OK]
Common Mistakes:
Using 'start' or 'run' instead of 'go'
Forgetting the 'go' keyword before function call
Trying to declare goroutine with 'goroutine' keyword
The function sayHello runs as a goroutine, so it runs concurrently with main. The main function sleeps 1 second to allow sayHello to print.
Step 2: Determine print order
Because of the sleep, "Hello" prints first from the goroutine, then "World" prints after sleep ends.
Final Answer:
Hello
World -> Option C
Quick Check:
Goroutine prints 'Hello' before main prints 'World' [OK]
Hint: Sleep lets goroutine finish before main prints [OK]
Common Mistakes:
Ignoring time.Sleep and missing 'Hello' output
Assuming 'World' prints before 'Hello'
Thinking goroutine blocks main function
4. Identify the problem in this Go code snippet:
package main
import "fmt"
func main() {
go func() {
fmt.Println("Running")
}()
fmt.Println("Done")
}
medium
A. Goroutines cannot be used inside main function.
B. The anonymous function syntax is incorrect.
C. The fmt package is not imported properly.
D. The program may exit before the goroutine runs, so "Running" might not print.
Solution
Step 1: Analyze goroutine execution timing
The goroutine runs concurrently, but main may finish and exit before the goroutine prints "Running".
Step 2: Check code correctness
The anonymous function syntax and imports are correct; goroutines can run inside main.
Final Answer:
The program may exit before the goroutine runs, so "Running" might not print. -> Option D
Quick Check:
Program exit can stop goroutine early [OK]
Hint: Main may exit before goroutine finishes [OK]
Common Mistakes:
Thinking anonymous function syntax is wrong
Believing goroutines can't run in main
Ignoring program exit timing
5. You want to download 3 files concurrently in Go and print "All done" only after all downloads finish. Which approach correctly uses concurrency to achieve this?
hard
A. Start 3 goroutines for downloads and use a sync.WaitGroup to wait for all to finish before printing "All done".
B. Call the download functions one after another without goroutines, then print "All done".
C. Start 3 goroutines but print "All done" immediately after starting them without waiting.
D. Use a for loop to start downloads but do not synchronize; rely on time.Sleep to wait.
Solution
Step 1: Understand concurrency with synchronization
Starting goroutines runs downloads concurrently, but we must wait for all to finish before printing "All done".
Step 2: Use sync.WaitGroup for waiting
sync.WaitGroup lets main wait until all goroutines complete, ensuring correct order.
Final Answer:
Start 3 goroutines for downloads and use a sync.WaitGroup to wait for all to finish before printing "All done". -> Option A
Quick Check:
WaitGroup synchronizes goroutines before final print [OK]
Hint: Use WaitGroup to wait for all goroutines [OK]
Common Mistakes:
Not waiting for goroutines before printing
Using sleep instead of proper synchronization
Running downloads sequentially without concurrency
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.