Go بالأمثلة: اتجاهات القنوات (Channel Directions)

عند استخدام القنوات كمعاملات للدالة، يمكنك تحديد ما إذا كانت القناة مخصصة للإرسال فقط أو الاستقبال فقط. هذا التحديد يزيد من سلامة الأنواع (type-safety) في البرنامج.

package main

import "fmt"

دالة ping هذه تقبل فقط قناة لإرسال القيم. سيكون من الخطأ (أثناء التصريف) محاولة الاستقبال من هذه القناة.

func ping(pings chan<- string, msg string) {
    pings <- msg
}

دالة pong تقبل قناة واحدة للاستقبال (pings) والثانية للإرسال (pongs).

func pong(pings <-chan string, pongs chan<- string) {
    msg := <-pings
    pongs <- msg
}

func main() {
    pings := make(chan string, 1)
    pongs := make(chan string, 1)
    ping(pings, "passed message")
    pong(pings, pongs)
    fmt.Println(<-pongs)
}

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

$ go run channel-directions.go
passed message

المثال التالي: الاختيار (Select).