Channels
Ek channel goroutines ke darmiyan 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 tareeqa 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 tor par chalta 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 darmiyan 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 tareeqa, class inheritance ke bajaye.
Practice exercise
Ek channel ch := make(chan string) banayein. Ek goroutine shuru karein jo ch par "done" send kare, phir main mein ch se value receive kar ke print karein.