Sobes.tech
Назад к вопросам
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: параллельное выполнение функции преобразования с синхронизацией результатов.