Channels
Ek channel goroutines ke beech values bhejne ke liye ek typed pipe hai. msg := <-messages tab tak block karta hai jab tak us channel par koi value send na ho, jo bilkul wahi tarika hai jisse neeche example mein do goroutines bina kisi shared variable ya lock ke coordinate karte hain.
package main
import "fmt"
func main() {
messages := make(chan string)
go func() {
messages <- "hello from a goroutine"
}()
msg := <-messages
fmt.Println(msg)
}hello from a goroutine
Ek real example: concurrently sum karna
sum apne khud ke goroutine ke roop mein run hota hai aur done hone par apna result wapas result par bhejta hai — main <-result par tab tak block karta hai jab tak woh value aa na jaaye. Yeh channel-based handoff Go ka idiomatic alternative hai manually goroutines ke beech memory share karne aur use locks se protect karne ka.
package main
import "fmt"
func sum(numbers []int, result chan<- int) {
total := 0
for _, n := range numbers {
total += n
}
result <- total
}
func main() {
result := make(chan int)
go sum([]int{1, 2, 3, 4, 5}, result)
fmt.Println(<-result)
}15
Aage: struct embedding — Go ka composition banane ka tarika, class inheritance ke bajaye.
Practice exercise
Ek channel ch := make(chan string) banao. Ek goroutine start karo jo ch par "done" send kare, phir main mein ch se value receive karke print karo.