Basic Syntax
go// Anonymous function go func() { fmt.Println("Running in goroutine") }() // Named function go myFunction(arg1, arg2) // Method call go obj.method() // Function with return value (value is discarded!) go calculateSomething() // ⚠️ Return value lost
Passing Arguments
❌ Wrong: Variable Capture
gofor i := 0; i < 5; i++ { go func() { fmt.Println(i) // All goroutines see i=5! }() }
✅ Correct: Pass as Parameter
gofor i := 0; i < 5; i++ { go func(n int) { fmt.Println(n) // Each goroutine has its own copy }(i) }
Waiting for Goroutines
Using WaitGroup
gopackage main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() // Decrement counter when done fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) // Increment counter go worker(i, &wg) } wg.Wait() // Block until counter is 0 fmt.Println("All workers completed") }
Using Channels
gofunc worker(id int, done chan bool) { fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id) done <- true // Signal completion } func main() { done := make(chan bool) for i := 1; i <= 5; i++ { go worker(i, done) } // Wait for all 5 workers for i := 1; i <= 5; i++ { <-done } fmt.Println("All workers completed") }
Was this helpful?