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

Задача: сумма в горутинах

Напишите функцию func parallelSum(nums []int, parts int, partSum func([]int) int) int. Она делит nums на parts частей из подряд идущих элементов, для каждой части один раз вызывает partSum в отдельной горутине и возвращает сумму всех результатов.

Функция partSum считает сумму одной части, но работает медленно: перед ответом она ждёт, как запрос к другому серверу. Поэтому все вызовы partSum должны идти одновременно, и тесты это проверяют. Дождитесь горутин с помощью sync.WaitGroup из урока 2 или соберите результаты через канал.

  • parallelSum([]int{1, 2, 3, 4}, 2, partSum) → 10
  • parallelSum([]int{1, 2, 3}, 5, partSum) → 6
  • parallelSum([]int{10, 20, 30, 40, 50, 60, 70, 80}, 4, partSum) → 360, и четыре вызова partSum ждут одновременно

Ограничения: parts не меньше 1 и может быть больше длины nums; длина nums не обязательно делится на parts; числа бывают отрицательными; для пустого nums результат — 0.

Часть номер p (от 0) — это nums[p*len(nums)/parts : (p+1)*len(nums)/parts]; при parts больше длины некоторые части пустые.

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

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

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

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

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

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