[英]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.