Go بالأمثلة: القنوات (Channels)

القنوات (Channels) هي الأنابيب التي تربط الـ goroutines المتوازية. يمكنك إرسال قيم إلى القنوات من goroutine واحد واستقبال تلك القيم في goroutine آخر.

package main

import "fmt"

func main() {

أنشئ قناة جديدة باستخدام make(chan val-type). القنوات محددة بنوع القيم التي تنقلها.

    messages := make(chan string)

أرسل قيمة إلى قناة باستخدام صيغة channel <-. هنا نرسل “ping” إلى قناة messages التي أنشأناها أعلاه، من goroutine جديد.

    go func() { messages <- "ping" }()

صيغة <-channel تستقبل قيمة من القناة. هنا سنستقبل رسالة “ping” التي أرسلناها أعلاه ونطبعها.

    msg := <-messages
    fmt.Println(msg)
}

عندما نشغل البرنامج، يتم تمرير رسالة “ping” بنجاح من goroutine إلى آخر عبر القناة الخاصة بنا.

تشغيل البرنامج:

$ go run channels.go 
ping

افتراضياً، عمليات الإرسال والاستقبال تعيق التنفيذ حتى يكون كل من المرسل والمستقبل جاهزين. سمحت لنا هذه الخاصية بالانتظار في نهاية برنامجنا لرسالة “ping” دون الحاجة لاستخدام أي أدوات تزامن أخرى.

المثال التالي: تخزين القنوات المؤقت (Channel Buffering).