concurrency
2w ago

How to create and use Goroutines

5 views • 0 upvotes

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
go
for i := 0; i < 5; i++ {
    go func() {
        fmt.Println(i) // All goroutines see i=5!
    }()
}
✅ Correct: Pass as Parameter
go
for i := 0; i < 5; i++ {
    go func(n int) {
        fmt.Println(n) // Each goroutine has its own copy
    }(i)
}

Waiting for Goroutines

Using WaitGroup

go
package 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

go
func 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?

Difficulty & Status

easy
Lvl. 2
Community Verified
Progress: 11%
Answered by: shubham vyasPrev TopicNext Topic