Назад к вопросам
Самокат
Junior — Middle
77
Каким образом реализована конкуренция потоков при использовании метода Map?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В Go нет встроенного метода Map для срезов, как в некоторых других языках. Конкурентная реализация Map обычно делается вручную с помощью горутин и каналов или sync.WaitGroup.
Основная идея — разбить исходный срез на элементы, запустить для каждого (или для батчей) отдельную горутину, которая применит функцию преобразования, и собрать результаты обратно.
Пример конкурентного Map для среза целых чисел:
func ConcurrentMap(input []int, fn func(int) int) []int {
output := make([]int, len(input))
var wg sync.WaitGroup
wg.Add(len(input))
for i, v := range input {
go func(i, v int) {
defer wg.Done()
output[i] = fn(v)
}(i, v)
}
wg.Wait()
return output
}
Здесь:
- Для каждого элемента запускается горутина.
- Используется
sync.WaitGroupдля ожидания завершения всех горутин. - Результаты записываются в срез по индексу, чтобы сохранить порядок.
Так реализуется конкуренция потоков (горутин) при Map: параллельное выполнение функции преобразования с синхронизацией результатов.