33 Конкурентность
Что делает select?
Ответ
select ждёт несколько операций с каналами и выполняет одну готовую. Если готовы несколько, выбор случайный. Ветка default срабатывает сразу, когда никто не готов, и превращает ожидание в неблокирующую проверку.
Подробнее
time.After создаёт канал, в который придёт время. В серверном цикле на каждой итерации так делать не стоит: таймеры копятся. Для повторяющегося таймаута бери time.NewTimer и сбрасывай его, либо context.
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("таймаут")
}
}