Зачем нужен системный вызов SELECT

«Зачем нужен системный вызов SELECT» — вопрос из категории Linux, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

select в Go используется для ожидания нескольких операций с каналами. Он блокирует выполнение, пока хотя бы один из каналов не будет готов к операции (чтение/запись). Если готовы несколько - выбирается случайный.

Пример:

ch1 := make(chan string)
ch2 := make(chan string)

go func() { ch1 <- "from ch1" }()
go func() { ch2 <- "from ch2" }()

select {
case msg1 := <-ch1:
    fmt.Println(msg1)
case msg2 := <-ch2:
    fmt.Println(msg2)
}

Ключевые особенности:

  • Не требует default (блокирующий режим)
  • С default становится неблокирующим
  • Порядок case не гарантирует приоритет
  • Часто используется с time.After для таймаутов