Реализуйте функцию or. Она принимает любое число сигнальных каналов <-chan interface{} и возвращает один канал. Этот канал должен закрыться, как только сработает любой из входных: его закрыли или в него прислали значение.
func or(channels ...<-chan interface{}) <-chan interface{}
Пример. Есть пять каналов, они закрываются через 2 часа, 5 минут, 1 секунду, 50 миллисекунд и 3 часа:
<-or(
sig(2*time.Hour),
sig(5*time.Minute),
sig(1*time.Second),
sig(50*time.Millisecond),
sig(3*time.Hour),
)
// разблокируется примерно через 50 мс, по самому быстрому каналу
Требования:
- Результат закрывается (
close), а не получает значение. Читать из него можно сколько угодно раз, и каждое чтение возвращает ok == false.
or() без аргументов возвращает nil.
or(c) с одним каналом возвращает отдельный канал. Он закрывается, когда c закрыли или в c прислали значение. Сам c при этом может остаться открытым.
- После срабатывания все вспомогательные горутины должны завершиться. Горутина, которая навсегда осталась ждать на
<-ch, считается утечкой.
- Решение работает для любого числа каналов, не только для пяти.
Тесты проверяют время срабатывания, закрытие вместо отправки значения, крайние случаи (0 и 1 канал) и утечки: после срабатывания число горутин должно вернуться к исходному, хотя остальные входы остались открытыми.