🐹 شرح Go

القنوات (Channels)

ما هي القناة؟

أنبوب آمن لتمرير القيم بين الـ goroutines:

ch := make(chan int)

go func() {
  ch <- 42        // إرسال
}()

value := <-ch     // استقبال (ينتظر حتى تصل قيمة)
fmt.Println(value)  // 42

التزامن عبر القنوات

القناة غير المخزّنة تزامن الإرسال والاستقبال — لا حاجة لـ time.Sleep:

done := make(chan bool)
go func() {
  fmt.Println("عمل")
  done <- true
}()
<-done   // ينتظر انتهاء الـ goroutine

القنوات المخزّنة (Buffered)

ch := make(chan int, 3)   // سعة 3
ch <- 1
ch <- 2                    // لا تتوقّف حتى تمتلئ

إغلاق القناة والمرور

ch := make(chan int, 3)
ch <- 1; ch <- 2; close(ch)

for v := range ch {   // يتوقّف عند الإغلاق
  fmt.Println(v)
}

select

ينتظر عدّة قنوات:

select {
case msg := <-ch1:
  fmt.Println("من ch1:", msg)
case msg := <-ch2:
  fmt.Println("من ch2:", msg)
default:
  fmt.Println("لا شيء جاهز")
}

💡 "تواصل لمشاركة الذاكرة" — القنوات هي الطريقة الاصطلاحية للتزامن في Go.

🎯 التالي: المزامنة بـ sync.