繁体   English   中英

在 WaitGroup 例程中使用 Channels 填充数组

[英]Populating an array using Channels in a WaitGroup routine

我想在子例程中填充 arrays 数组。 我正在尝试使用频道来做到这一点。 我正在学习 go,所以不清楚这是否是正确的方法,所以如果我走错了方向,请纠正我,但我的代码永远不会返回。 我究竟做错了什么?

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)

从代码看来,通道 c 没有被读取,并且代码卡在那里。

此代码不需要任何同步(通道等),因为每个 goroutine 都在处理不同部分的values ,gr1->[xx,0]、gr2->[xx,1]、gr3-> [xx,2] , gr4-> [xx,3]。

只需从代码中删除通道 c ,这应该可以正常工作。

将 goroutine 代码更改为:

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

正如先前的答案所述,您的频道未被阅读。

但是,如果您缓冲您的频道(在您的情况下为 4 的缓冲区),则代码应该完成。

删除通道也是可行的解决方案。 我不确定您为什么将要构建的整个数组传递给通道。 我假设您正在检查数组是如何变化的以及例程是如何工作的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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