package main
import (
"fmt"
"time"
)
func main() {
// Misolda ikki kanal ustidan select qilamiz
c1 := make(chan string)
c2 := make(chan string)
// Har bir kanal ma'lum vaqtdan so'ng qiymat oladi (bloklovchi RPC'ni taqlid qilish kabi)
go func() {
time.Sleep(1 * time.Second)
c1 <- "one"
}()
go func() {
time.Sleep(2 * time.Second)
c2 <- "two"
}()
// select bilan ikkala qiymatni ham kutamiz va kelganini darhol chop etamiz
for range 2 {
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
}
}
}
Kutilganidek, avval "one", keyin "two" qiymatlari olinadi.
Terminalda bajarish:
$ time go run select.go
received one
received two
real 0m2.245s
E'tibor bering, umumiy bajarilish vaqti ~2 soniya, chunki 1 va 2 soniyalik kutishlar goroutinalarda parallel bajariladi.