Ответ
Для динамического 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)
Ключевые моменты:
reflect.SelectCaseописывает каждый caseDirуказывает направление: Recv, Send или Default- Можно динамически добавлять/удалять case-ы
- Возвращает индекс выбранного case и значения (если применимо)
Осторожно: reflection снижает читаемость и производительность. Используйте только когда действительно нужна динамичность.