Тестовое задание от компании Mechta на позицию Go разработчик.
Написать программу для вычисления суммы чисел в файле.
Дан JSON файл в виде массива объектов, как показано ниже:
[
{"a": 1, "b": 3},
{"a": 5, "b": -9},
{"a": -2, "b": 4}
...
]
Количество объектов = 1,000,000. Значения чисел в диапазоне [-10, 10].
Программа должна считать файл и вычислить сумму всех чисел. Для этого она должна:
- Распараллелить вычисление по горутинам.
- Количество горутин для параллельной обработки нужно получить при запуске программы через аргумент.
- Вывести общий результат в консоль.
- Опубликовать решение на github.com и предоставить доступ.
В основе решения лежат две функции: worker
и calcSum
.
Передаем структуру Input
, примитив синхронизации WaitGroup
и канал, в который будем записывать нашу сумму.
Передаем количество воркеров, которые будут выполнять операции сложения, и слайс структуры нашего JSON файла.
- Переменная
chunkSize
отвечает за размер кусков. - Переменная
sumChan
— буферизированный канал с размером, равным количеству горутин, которые мы передали. - В цикле
for
переменнаяstart
— это начальный индекс нашего куска, аend
— конечный индекс.
if end > len(numbers) {
end = len(numbers)
}
Конечный индекс изменяется, если он превысил количество чисел в нашем слайсе.
if start >= end {
break
}
В этом условии мы прерываем цикл, если данные в слайсе закончились, тем самым завершая работу.
wg.Add(1)
go worker(numbers[start:end], &wg, sumChan)
Добавляем горутину в WaitGroup
и запускаем ее, передавая часть данных для обработки.
go build -o sum_calc main.go
./sum_calc <dir_location> <number_of_workers>
./sum_calc data/input.json 10
main.go
— исходный код программы.data/
— директория с входными JSON файлами для тестирования.