AnyCompiler

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)
}
Output
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)
}
Output
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.