简体   繁体   中英

Populating an array using Channels in a WaitGroup routine

I want to populate an array of arrays inside a subroutine. I am trying to do this using a channel. I am learning go, so unclear if this is the right way, so please correct me if I am going in the wrong direction, but my code never returns. What am I doing wrong?

var c = make(chan [15][4]string)

var mymap = map[int]string{
    0: "www.foo.com",
    1: "www.bar.com",
    2: "www.baz.com",
    3: "www.faz.com",
}

values := [3][4]string{{"A", "B", "C", "D"}}

var wg sync.WaitGroup
wg.Add(4) // one thread per index, total 4 indexes

for idx, url := range mymap {
    go func(idx int, url string) {
        defer wg.Done()
        values[1][idx] = "someone"
        values[2][idx] = "something"
        c <- values
    }(name, url)
}

wg.Wait()
close(c)

From code it looks like channel c is not read, and code is stuck there.

This code doesn't need any synchronisation (channel etc.) because each goroutine is working on different part of values , gr1->[xx,0], gr2->[xx,1], gr3-> [xx,2], gr4-> [xx,3].

Just remove the channel c from the code and this should work fine.

Change goroutine code to:

go func(idx int, url string, arr *[3][4]string) {
  defer wg.Done()
  arr[1][idx] = "someone"
  arr[2][idx] = "something"
}(idx, url, &values)

As previous answer states, you channel is not read.

However, if you buffer your channel (buffer of 4 in your case) the code should finish.

Also removing the channel is viable solution. I am not sure why you pass the whole array you are building to the channel. I assume you examining how the array gets changed and how the routines work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM