Задача: результаты по мере готовности
Напишите функцию func gather(jobs []func() int) chan int. Она запускает каждую задачу из jobs в отдельной горутине и сразу возвращает канал, не дожидаясь задач. Каждая задача отправляет свой результат в этот канал, как только досчитает.
Результаты приходят в том порядке, в каком задачи их досчитали, а не в порядке jobs: задачи работают разное время. В тестах job(v, ms) — задача, которая ждёт ms миллисекунд и возвращает v.
gather([]func() int{job(7, 10)})→ из канала приходит7gather([]func() int{job(1, 90), job(2, 30), job(3, 60)})→ приходят2,3,1gather([]func() int{job(4, 20), job(4, 20), job(0, 20)})→ приходят0,4,4в любом порядке
Ограничения: из канала приходит ровно len(jobs) результатов, по одному от каждой задачи; закрывать канал не обязательно; для пустого jobs не приходит ничего, но функция всё равно возвращает созданный канал, а не nil; задача может ждать другую задачу из того же jobs; два вызова gather не смешивают результаты.
Проверка запускает тесты с детектором гонок: если горутины без синхронизации меняют общую переменную, например общий счётчик, решение не пройдёт.
Не добавляйте лишних импортов, если в задаче это прямо не сказано.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.