Могу ли я выполнить действие для всех элементов среза одновременно?

У меня есть следующий код:

func myfunction() {
    results := make([]SomeCustomStruct, 0)

    // ... results gets populated ...

    for index, value := range results {
        results[index].Body = cleanString(value.Body)
    }

    // ... when done, more things happen ...
}

func cleanString (in string) (out string) {
    s := sanitize.HTML(in)
    s = strings.Replace(s, "\n", " ", -1)
    out = strings.TrimSpace(s)
    return
}

Срез никогда не будет содержать более 100 или около того записей. Есть ли способ, как я могу использовать здесь подпрограммы для выполнения функции cleanString для каждого элемента среза одновременно, а не по одному?

Спасибо!

1 ответ

Решение

Если срез имеет только 100 элементов или меньше, и это все cleanStringвы не получите большого ускорения, если строки тела не будут достаточно большими.

Распараллеливание его с goroutines будет выглядеть примерно так:

var wg sync.WaitGroup
for index, value := range results {
    wg.Add(1)
    go func(index int, body string) {
        defer wg.Done()
        results[index].Body = cleanString(body)
    }(index, value.Body)
}
wg.Wait()
Другие вопросы по тегам