تتيح لك عبارة select في Go انتظار عدة عمليات على القنوات. يُعد الجمع بين روتينات Go والقنوات وselect من مزايا Go القوية.
select
package main
import ( "fmt" "time" )
func main() {
سنختار في مثالنا بين قناتين.
c1 := make(chan string) c2 := make(chan string)
ستستقبل كل قناة قيمة بعد مدة معينة، لمحاكاة عمليات RPC حاجزة مثلًا تعمل داخل روتينات Go متزامنة.
go func() { time.Sleep(1 * time.Second) c1 <- "one" }() go func() { time.Sleep(2 * time.Second) c2 <- "two" }()
سنستخدم select لانتظار القيمتين معًا، وطباعة كل منهما عند وصولها.
for range 2 { select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } } }
نستقبل القيمتين "one" ثم "two" كما هو متوقع.
"one"
"two"
$ time go run select.go received one received two
لاحظ أن إجمالي وقت التنفيذ يبلغ نحو ثانيتين فقط، لأن عمليتي Sleep اللتين تستغرقان ثانية وثانيتين تعملان بالتزامن.
Sleep
real 0m2.245s
المثال التالي: المهل الزمنية.
إعداد Mark McGranaghan وEli Bendersky | المصدر الأصلي | الرخصة الترجمة العربية بواسطة 0xKa | الموقع الشخصي | مصدر الترجمة