Оператор select
Мультиплексирование каналов с помощью select
«Оператор select» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое select
Оператор select позволяет горутине одновременно ожидать выполнения нескольких операций с каналами. Он выбирает первый готовый вариант, подобно switch, но для каналов.
Базовый синтаксис
Каждый case в операторе select — это отправка в канал или получение из него:
select {
case msg := <-ch1:
fmt.Println("ch1:", msg)
case msg := <-ch2:
fmt.Println("ch2:", msg)
}Неблокирующий режим с default
Добавление варианта default делает оператор select неблокирующим: если ни один канал не готов, выполнение сразу переходит к default.
select {
case v := <-ch:
fmt.Println(v)
default:
fmt.Println("no value ready")
}Случайный выбор
Если одновременно готовы несколько вариантов, Go выбирает один случайным образом: у каждого готового варианта одинаковая вероятность выбора. Это предотвращает голодание.
Отправка в операторе select
Варианты также могут выполнять отправку в канал. Вариант отправки готов, когда в канале есть место в буфере (или его ожидает получатель).
select {
case ch1 <- val1:
fmt.Println("sent to ch1")
case ch2 <- val2:
fmt.Println("sent to ch2")
}Пустой select блокируется навсегда
Оператор select{} без вариантов навсегда блокирует текущую горутину. Это распространённый приём, позволяющий основной горутине оставаться активной, пока выполняются другие горутины.
func main() {
go serve()
select {} // block forever
}Цикл с оператором select
Поместите select внутрь цикла for, чтобы постоянно обслуживать несколько каналов. Добавьте канал завершения, чтобы корректно выйти из цикла.
for {
select {
case v := <-data:
process(v)
case <-done:
return
}
}Нулевые каналы
Нулевой канал навсегда блокирует соответствующий вариант в операторе select, фактически отключая его. Это позволяет динамически включать и отключать варианты во время выполнения.
var ch chan int // nil
select {
case v := <-ch: // never selected
_ = v
case v := <-other:
fmt.Println(v)
}Оператор select с закрытыми каналами
Получение из закрытого канала всегда завершается немедленно и возвращает нулевое значение. Используйте форму с двумя возвращаемыми значениями, чтобы определить факт закрытия.
select {
case v, ok := <-ch:
if !ok { return } // channel closed
use(v)
}Шаблоны приоритизации
Оператор select в Go изначально не поддерживает приоритеты. Чтобы отдать предпочтение одному каналу, вкладывайте операторы select друг в друга или используйте цикл, который сначала проверяет канал с высоким приоритетом с помощью default.
for {
select {
case v := <-highPriority:
handle(v)
default:
select {
case v := <-lowPriority:
handle(v)
}
}
}Промежуточные итоги
Оператор select ожидает несколько каналов, выбирает случайный готовый вариант, поддерживает default для неблокирующего режима, а нулевые каналы отключают варианты. Распространённый шаблон: for+select+done.
Проверка знаний
Что происходит, когда несколько вариантов в операторе select готовы одновременно?
Итоги: оператор select
Главное:
- Оператор select блокируется, пока не будет готов один из вариантов работы с каналом
- Несколько готовых вариантов → случайный выбор
- default делает оператор неблокирующим
- Нулевой канал отключает соответствующий вариант
- for+select+done — стандартный цикл для обслуживания нескольких каналов
Часто задаваемые вопросы
Урок «Оператор select» бесплатный?
Да — полный текст урока «Оператор select» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Оператор select»?
Мультиплексирование каналов с помощью select Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Оператор select»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.