AzLearn

القنوات

Channels

مفهوم ~22 دقيقة

القنوات — Channels

القنوات هي الطريقة الرسمية للتواصل بين goroutines في Go. تخيّلها كأنابيب: goroutine واحد يُرسل قيمة من طرف، و goroutine آخر يستقبلها من الطرف الآخر.

القنوات تحل مشكلتين:

  1. التواصل — تمرير البيانات بين goroutines
  2. التزامن — ضمان ترتيب العمليات

إنشاء قناة واستخدامها

main.go

كيف تعمل القناة غير المُخزّنة — Unbuffered Channel

القناة غير المُخزّنة (الافتراضية) تعمل كنقطة تسليم مباشرة:

  • المُرسل ينتظر حتى يكون هناك مُستقبل
  • المُستقبل ينتظر حتى يكون هناك مُرسل
  • يتم التبادل في نفس اللحظة — هذا يُسمى synchronization
main.go

القنوات المُخزّنة — Buffered Channels

القناة المُخزّنة لها سعة — المُرسل لا ينتظر إلا إذا امتلأت القناة:

main.go

متى تستخدم كل نوع؟

النوعمتى
غير مُخزّنتريد تزامناً مضموناً (تسليم مباشر)
مُخزّنتريد فصل المُرسل عن المُستقبل (مثل قائمة مهام)

التكرار على قناة — Range over Channel

main.go

قواعد الإغلاق:

  • فقط المُرسل يغلق القناة — أبداً المُستقبل
  • الإرسال لقناة مغلقة يسبب panic
  • الاستقبال من قناة مغلقة يُرجع القيمة الصفرية فوراً

اتجاه القناة — Channel Direction

يمكنك تحديد اتجاه القناة في معاملات الدوال لزيادة الأمان:

main.go

⚠️ الجمود — Deadlock

الجمود يحدث عندما ينتظر الجميع ولا أحد يعمل:

// ❌ جمود! main ينتظر ولا أحد يُرسل
ch := make(chan int)
<-ch  // deadlock!

// ❌ جمود! main يُرسل ولا أحد يستقبل (قناة غير مُخزّنة)
ch := make(chan int)
ch <- 42  // deadlock!

Go يكتشف الجمود ويُوقف البرنامج برسالة: fatal error: all goroutines are asleep - deadlock!

نمط عملي: خط أنابيب — Pipeline Pattern

main.go
تحدي — Challenge