Как получить несколько map [string] int через канал и объединить их в одну карту? - PullRequest
1 голос
/ 04 апреля 2019

Я реализую функцию, которая считает слова, и я пытаюсь написать это с помощью подпрограмм. До сих пор я сделал массивы []string для подходящих размеров исходного текста строки, и я отправляю их в goroutine каждое, чтобы подсчитать слова и добавить их в пару k / v внутри map[string]int, затем я хочу взять их все через мой канал и прочитайте все карты и просто посчитайте, сколько всего слов было в наличии, и верните это map[string]int, но это то, где я потерялся. Я пытался сделать что-то вроде

mapSummary := make(map[string]int)
for k, v := range channel {
    mapSummary[k] += v
}

но это не работает, так как я использую две переменные в диапазоне, и только с одной я не уверен, как это сделать. Итак, как мне добавить все эти карты вместе, которые я отправил через канал? Мне не нужны, чтобы вы, ребята, показали мне, как именно это делается (это домашнее задание), но, поскольку я не получал никакой помощи от моих ТП в нашей лабораторной работе, я был бы очень признателен за некоторые подсказки относительно того, как это должно быть сделано, я также Посмотрите, как я распределяю массив []string, это плохо, но я сам это выясню! :) Этот код не включает основную функцию или большую часть кода, но необходимые части, которые, я надеюсь, помогут вам понять это.

ch := make(chan map[string]int)
for i := 0; i < 8; i++ {
    wg.Add(1)
    words := text[i*(len(text)/8):(i+1)*(len(text)/8)]
    go count(words, ch, wg)
}
wg.Wait()

mapSummary := make(map[string]int)
for k, v := range ch {
    mapSummary[k] += v
}
return mapSummary

func count(words []string, ch chan<- map[string]int, wg *sync.WaitGroup) {
    freqs := make(map[string]int)
    for _, word := range words {
        freqs[word] += 1
    }
    wg.Done()
    ch <- freqs
}

он говорит мне "слишком много переменных в диапазоне".

1 Ответ

0 голосов
/ 04 апреля 2019

Если я использую для k, v: = диапазон канала, он говорит мне много переменных в диапазоне

Это потому, что канал - это только список значений, здесь нет ключа.Так что сделайте это:

for val := range channel {
    // ..
}

Теперь val будет одной из ваших карт, каждый раз в цикле, так что вы, вероятно, тоже захотите увеличить ее:

for val := range channel {
    for k, v := range val {
        // Put your aggregation logic here
    }
}
...