Go با مثال: دستور select

دستور select در Go به شما اجازه می‌دهد منتظر چند عملیات کانال به‌طور هم‌زمان بمانید. ترکیب گوروتین‌ها و کانال‌ها با select یکی از قابلیت‌های قدرتمند Go است.

package main
import (
    "fmt"
    "time"
)
func main() {

در این مثال روی دو کانال select می‌کنیم.

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

هر کانال پس از مدتی یک مقدار دریافت می‌کند تا مثلاً عملیات RPC مسدودکننده‌ای را شبیه‌سازی کنیم که در گوروتین‌های هم‌روند اجرا می‌شوند.

    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" را دریافت می‌کنیم.

$ time go run select.go 
received one
received two

توجه کنید که کل زمان اجرا فقط حدود ۲ ثانیه است، چون Sleepهای ۱ و ۲ ثانیه‌ای هم‌زمان اجرا می‌شوند.

real    0m2.245s

مثال بعدی: .