go - 多个围棋例程的一个障碍
问题描述
我正在尝试使用 goroutines。
我有一个执行 x 次的 goroutine 函数,我想等待所有这些例程在我的 main 函数中继续。我尝试使用 chan 作为屏障。
我尝试过这样的事情:
func goroutine(i int, ch []chan bool) {
//do stuff
ch[i] <- true
}
func main() {
var ch []chan bool
for i := 0; i < nb; i++ {
ch[i] = make(chan bool)
go goroutine(i, ch)
}
// wait to continue
for i := 0; i < nb; i++ {
<- ch[i]
}
}
我有以下错误:panic: runtime error: index out of range
对于该行ch[i] = make(chan bool)
第一个问题:
- 是使用 chan 的好方法吗?
第二个问题:
- 为什么我有这个索引超出范围错误?
解决方案
如果您只想等待 goroutines 完成并且不需要通过通道返回结果,那么sync.WaitGroup
这将是一个更清洁的解决方案。可行的方法是:
- 创建一个 WaitGroup wg 并在您启动 goroutine 调用
wg.Add(1)
并将指向 wg 的指针传递给 goroutine 时。 - 在 goroutine 中,在返回调用之前
wg.Done()
- 要等待所有 goroutine 完成,请调用
wg.Wait()
推荐阅读
- mysql - mysql中的正则表达式来回答给定的查询
- reactjs - 开玩笑 - 模拟需要事先配置的节点模块
- rust - 为什么创建 const 指针集合可以使用 `for val in a.iter()` 而不是 `a.iter().map(|val| val)`?
- git - 如何回到git?
- flutter - 如何使 TextField 文本与 prefixIcon 在同一行?
- c++ - Windows 链接器是否使用 LoadLibrary 解析 DLL 中的未定义符号?
- html - 为什么我的第三张图片不与其他图片对齐?
- c++ - 在 C++ 中使用来自另一个头文件的抽象类
- c++ - 如何在 websocketpp 中使用自定义记录器?
- javascript - 用#屏蔽字符串