27.آموزش GO با مثال(Select)

دستور 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

<<هدایت کانال----------------------------------------زمان تأخیر>>