Все вопросы

33 Конкурентность

Что делает select?

select ждёт несколько операций с каналами и выполняет одну готовую. Если готовы несколько, выбор случайный. Ветка default срабатывает сразу, когда никто не готов, и превращает ожидание в неблокирующую проверку.

time.After создаёт канал, в который придёт время. В серверном цикле на каждой итерации так делать не стоит: таймеры копятся. Для повторяющегося таймаута бери time.NewTimer и сбрасывай его, либо context.

Пример

Go

первая готовая ветка

package main

import (
    "fmt"
    "time"
)

func main() {
    a := make(chan string, 1)
    b := make(chan string, 1)
    a <- "из a"

    select {
    case v := <-a:
        fmt.Println(v)
    case v := <-b:
        fmt.Println(v)
    case <-time.After(time.Second):
        fmt.Println("таймаут")
    }
}