1 回答
TA贡献1829条经验 获得超7个赞
我已经在playground中简化了您的代码。
您似乎假设f.Manager.Wg.Wait()
返回时所有错误都已处理。然而,错误正在一个单独的 goroutine ( **//go routine A**
) 中处理,您不会等待它完成——事实上,因为您不关闭f.Manager.ErrorChan
goroutine 永远不会完成。
解决这个问题的最简单方法是等待 goroutine 退出,然后再从函数返回。下面的示例 ( playground ) 使用一个通道来执行此操作,但WaitGroup
如果您愿意,也可以使用一个。
var errors []error
errDone := make(chan struct{})
go func() {
for {
select {
case err, ok := <-errorChan:
if ok {
errors = append(errors, err)
log.Printf("got error %v", errors)
} else {
log.Printf("returning")
close(errDone)
return
}
}
}
}()
wg.Wait()
// Everything sending to errorChan is now done so we can safely close the channel
close(errorChan)
<-errDone // Wait for error handling goroutine to complete
请注意,defer
“在周围函数返回之前立即运行”。您启动的任何 goroutine 都可以比该函数存活(它们不会自动停止)。
- 1 回答
- 0 关注
- 70 浏览
添加回答
举报