Go بالأمثلة: الاختيار (Select)

عبارة select في Go تسمح لك بالانتظار على عمليات قنوات متعددة. دمج الـ goroutines والقنوات مع ‘select’ هو ميزة قوية في Go.

package main

import (
    "fmt"
    "time"
)

func main() {

لمثالنا سنقوم بالاختيار عبر قناتين.

    c1 := make(chan string)
    c2 := make(chan string)

كل قناة ستستلم قيمة بعد قدر معين من الوقت، لمحاكاة عمليات RPC المعيقة التي تنفذ في goroutines متوازية.

    go func() {
        time.Sleep(1 * time.Second)
        c1 <- "واحد"
    }()
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "اثنان"
    }()

سنستخدم select لانتظار هاتين القيمتين في آن واحد، وطباعة كل واحدة فور وصولها.

    for range 2 {
        select {
        case msg1 := <-c1:
            fmt.Println("تم استلام", msg1)
        case msg2 := <-c2:
            fmt.Println("تم استلام", msg2)
        }
    }
}

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

$ time go run select.go 
تم استلام واحد
تم استلام اثنان

real    0m2.245s

لاحظ أن إجمالي وقت التنفيذ هو حوالي ثانيتين فقط لأن كلا عمليتي الانتظار (Sleeps) لثانية وثانيتين تم تنفيذهما بالتوازي.

المثال التالي: مهلات الوقت (Timeouts).