Заполните значения карты из ответа канала в golang - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь заполнить карту, основываясь на выводе из различных программ.Для этого я создал канал типа (map [key] [] int)

done := make(chan map[int][]int)

и передаю его рабочим задачам вместе со значением ключа, которое, например, является int.для i: = 0;я <10;i ++ {go worker (i, done)} Я хочу заполнить карту, когда я читаю по ключу.В настоящее время я делаю, как показано ниже </p>

for i := 0; i < 10; i++ {
    m := <-done
    fmt.Println(m)
    for k,v := range m {
        retmap[k] = v
    }
}
fmt.Println(retmap)

Я чувствую, что я делаю это не правильно.Есть ли лучший способ сделать это с помощью каналов?Любые предложения будут высоко оценены?

детская площадка: https://play.golang.org/p/sv4Qk4hEljx

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете использовать определенный канал для каждого работника вместо кодирования этой информации в результирующем объекте работника.Что-то вроде:

func worker(done chan []int) {
    fmt.Print("working...")
    rnd := rand.Intn(10)
    fmt.Println("Sleeping for ", rnd, "seconds")
    for i := 0; i < rnd; i++ {
        time.Sleep(time.Second)
    }
    fmt.Println("done")

    // Send a value to notify that we're done.
    done <- makeRange(0, rnd)
}

func main() {
    channels := make([]chan []int, 10, 10)
    for i := 0; i < 10; i++ {
        channels[i] = make(chan []int)
        go worker(channels[i])
    }

    retmap := make(map[int][]int)
    for i := 0; i < 10; i++ {
        retmap[i] = <-channels[i]
    }
    fmt.Println(retmap)
}

ссылка на игровую площадку

...