Go за Прикладом: Select

Work in Progress / Сайт в процесі розробки

Go’шний select (вибір) довзовляє вам очікувати на операція з кількома каналами. Комбінування горутин та каналів з select це дуже потужна особливість Go.

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

Наприклад ми хочемо обирати поміж двох каналів.

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

Кожен канал отримає значення після якогось проміжку часу, симулючи, скажімо, блокуючі виклики від сторонніх сервісів що виконуються одночасних г орутинах.

    go func() {
        time.Sleep(1 * time.Second)
        c1 <- "один"
    }()
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "два"
    }()

Ми використаємо select для очікування обох значень одночасно, друкуючи повідомлення на екран щойно ми їх отримаємо.

    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-c1:
            fmt.Println("отримано", msg1)
        case msg2 := <-c2:
            fmt.Println("отримано", msg2)
        }
    }
}

Ми отримаємо спочатку значення "один", а вже потім "два" - так як і задумувалось.

$ time go run select.go
отримано один
отримано два

Зауважте що час виконання близько 2 секунд оскільки і для 1шої, і для 2гої секунди команда “Sleep” (спати) виконується одночасно.

real	0m2.245s

Наступний приклад: Тайм-аути (Timeouts).