0Pricing
Go Academy · Урок

Оператор 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 — локальная установка не требуется.

Все уроки этого курса

  1. Оператор select
  2. Тайм-ауты и тикеры
  3. Шаблоны fan-in и fan-out
  4. Шаблон пула работников
← Назад к Go Academy