Как сделать select динамическим

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

Ответ

Для динамического select можно использовать reflect.Select. Он позволяет создавать case-ы во время выполнения. Пример:

cases := make([]reflect.SelectCase, 0)

// Добавляем case для канала
ch := make(chan int)
cases = append(cases, reflect.SelectCase{
    Dir:  reflect.SelectRecv,
    Chan: reflect.ValueOf(ch),
})

// Добавляем case с default
cases = append(cases, reflect.SelectCase{
    Dir:  reflect.SelectDefault,
})

// Выполняем select
chosen, recv, recvOK := reflect.Select(cases)

Ключевые моменты:

  1. reflect.SelectCase описывает каждый case
  2. Dir указывает направление: Recv, Send или Default
  3. Можно динамически добавлять/удалять case-ы
  4. Возвращает индекс выбранного case и значения (если применимо)

Осторожно: reflection снижает читаемость и производительность. Используйте только когда действительно нужна динамичность.