03 Advanced Go (Concurrency)
Go famous hi Concurrency ke liye hai. Matlab ek saath bahut sare kaam karna.
1. Goroutines (Lightweight Threads) 🏃♂️
Agar aap function call ke aage go laga dein, to wo background me chalega (Main program rukega nahi).
package mainimport ( "fmt" "time")
func sayHello(n int) { for i := 0; i < n; i++ { fmt.Println("Hello", i) time.Sleep(100 * time.Millisecond) }}
func main() { go sayHello(5) // Background me chalega fmt.Println("Main function chal raha hai...")
time.Sleep(1 * time.Second) // Wait karna padega warna main khatam ho jayega!}Note: Goroutines bahut lightweight hoti hain (sirf 2KB memory).
2. Channels (Talking between Goroutines) 📞
Goroutines ek doosre se baat karne ke liye Channels use karti hain.
func main() { msgChannel := make(chan string) // Channel banaya
go func() { msgChannel <- "Hi from Goroutine! 👋" // Message bheja }()
msg := <-msgChannel // Message receive kiya fmt.Println(msg)}Unbuffered vs Buffered
- Unbuffered: Sender block ho jata hai jab tak koi Receiver na ho.
- Buffered:
make(chan string, 2). 2 messages tak store kar sakta hai bina block huye.
3. WaitGroups (Intezaar karna) ⏳
time.Sleep use karna unprofessional hai. Hum sync.WaitGroup use karte hain.
import "sync"
var wg sync.WaitGroup
func worker(id int) { defer wg.Done() // Kaam khatam hone par batao fmt.Printf("Worker %d starting\n", id)}
func main() { for i := 1; i <= 3; i++ { wg.Add(1) // 1 Worker add kiya go worker(i) } wg.Wait() // Sabke khatam hone ka wait karo}
---
## 4. Race Conditions & Mutex 🔒
Jab do Goroutines same variable ko ek saath access karein, to data corrupt ho sakta hai (**Race Condition**).Isse bachne ke liye hum **Mutex (Mutual Exclusion)** use karte hain.
```goimport "sync"
var count = 0var mu sync.Mutex
func increment() { mu.Lock() // Darwaza band (Koi aur nahi aa sakta) count++ // Critical Section mu.Unlock() // Darwaza khula}5. Select (Multi-Channel Handler) 🚦
Agar multiple channels se data aana ho, to select use karte hain.
select {case msg1 := <-chan1: fmt.Println("Channel 1 se aya:", msg1)case msg2 := <-chan2: fmt.Println("Channel 2 se aya:", msg2)default: fmt.Println("Abhi koi data nahi hai.")}