دستور select در GO این امکان را به شما میدهدکه روی عملیات کانال چندگانه بتوانید زمان گذاری کنید.ترکیب کردن goroutineها و کانالها با select یک ویژگی قدرتمند Go است.
package main import "time" import "fmt" func main() {
برای مثال ما select را بر روی دو کانالمان اعمال مکنیم.
c1 := make(chan string) c2 := make(chan string)
هر کانال یک مقدار را پس از گذری از زمان دریافت میکند , به عنوان مثال برای شبیه سازی . عملیات های مسدود سازی RPC در goroutine ها همزمان اجرا میشوند.
go func() { time.Sleep(1 * time.Second) c1 <- "one" }() go func() { time.Sleep(2 * time.Second) c2 <- "two" }()
ما از select
برای منتظر گذاشتن هردوی این مقادیر به صورت همزمان استفاده میکنیم , هرکدام از آنها که نوبت آن میرسد را چاپ کنیم.
for i := 0; i < 2; i++ { 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
توجه داشته باشید که زمان اجرای کل فقط~2 ثانیه است زیرا هر دو 1 و 2 ثانیه Sleeps
همزمان اجرا میشوند.
real 0m2.245s
<<هدایت کانال----------------------------------------زمان تأخیر>>