Реализуйте функцию Merge, которая объединяет произвольное число входных
каналов в один выходной канал (паттерн fan-in).
func Merge(channels ...<-chan int) <-chan int
Требования:
- Все значения из всех входных каналов должны попасть в выходной канал.
- Выходной канал закрывается ровно тогда, когда все входные каналы
вычитаны до конца и закрыты.
- Если каналов не передано вообще (
Merge()), функция возвращает уже
закрытый пустой канал.
Тест передаёт 3 канала с известными значениями, вычитывает всё из Merge
через range и проверяет, что мультимножество собранных значений равно
объединению входов, а также что выходной канал закрывается (цикл range
завершается) в пределах таймаута.
На что смотрит интервьюер:
- По одной горутине на каждый входной канал, пересылающей значения в
out.
sync.WaitGroup отслеживает завершение всех пересыльщиков; отдельная
горутина закрывает out после wg.Wait() — закрытие происходит ровно один раз.
- Нет утечек горутин и гонок под
-race; корректная обработка краевого
случая с нулём каналов.