Перейти к содержимому
Задача · Горутины и каналы · урок 13 из 13

Задача: результаты по мере готовности

Напишите функцию func gather(jobs []func() int) chan int. Она запускает каждую задачу из jobs в отдельной горутине и сразу возвращает канал, не дожидаясь задач. Каждая задача отправляет свой результат в этот канал, как только досчитает.

Результаты приходят в том порядке, в каком задачи их досчитали, а не в порядке jobs: задачи работают разное время. В тестах job(v, ms) — задача, которая ждёт ms миллисекунд и возвращает v.

  • gather([]func() int{job(7, 10)}) → из канала приходит 7
  • gather([]func() int{job(1, 90), job(2, 30), job(3, 60)}) → приходят 2, 3, 1
  • gather([]func() int{job(4, 20), job(4, 20), job(0, 20)}) → приходят 0, 4, 4 в любом порядке

Ограничения: из канала приходит ровно len(jobs) результатов, по одному от каждой задачи; закрывать канал не обязательно; для пустого jobs не приходит ничего, но функция всё равно возвращает созданный канал, а не nil; задача может ждать другую задачу из того же jobs; два вызова gather не смешивают результаты.

Проверка запускает тесты с детектором гонок: если горутины без синхронизации меняют общую переменную, например общий счётчик, решение не пройдёт.

Не добавляйте лишних импортов, если в задаче это прямо не сказано.

gather.go — go
go · строк: 8
Ctrl+Enter запуск · Esc выйти из редактора

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом