Go в примери: Избор на канал (select)

Ключовата дума select ни позволява да очакваме (и приемаме) данни от много канали едновременно. Съчетаването на канали и select ни дава много мощ.

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

За целите на нашия пример ще избираме от два канала.

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

Всеки канал получава някаква стойност след известно време. Така наподобяваме да речем RPC1 действия, изпълняващи се в различни едновременни гозадачи.


  1. RPC (Remote Procedure Calls) – Извикване на отдалечени процедури
    go func() {
        time.Sleep(1 * time.Second)
        c1 <- "едно"
    }()
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "две"
    }()

Използваме select, за да очакваме две стойности едновременно, като извеждаме на екрана полученото веднага щом пристигне някоя от тях.

    for range 2 {
        select {
        case писмо1 := <-c1:
            fmt.Println("получено", писмо1)
        case писмо2 := <-c2:
            fmt.Println("получено", писмо2)
        }
    }
}

Получаваме стойностите "едно" и после `“две”, както очакваме.

$ time go run select.go
получено едно
получено две

Забележете, че общото време за изпълнение е само около две секунди, а не три, тъй като заспиването за една и две секунди се изпълняват едновременно.

real    0m2.245s

Следващ пример: .