请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于errMap

func VideoClearExecutor(dc dataChan) error {
	errMap := &sync.Map{}
	
	// ......
	
	errMap.Range(func(k, v interface{}) bool {
		err = v.(error)
		if err != nil {
			return false
		}
		return true
	})
	
	// ......
}

艾文西老师,我感觉把 errMap 挪到函数体外作为包级变量使用好一些,

否则 errMap.Range 每次调用的都是局部创建的新的 errMap ,

那么之前的 goroutine 就算有 error 也不是往当前这个 map 里面写,

那么 errMap.Range 这段逻辑也就没什么用了。

正在回答 回答被采纳积分+3

1回答

艾文西 2020-03-28 13:43:12

没看懂,之前的goroutine肯定不会往这个map里写啊。

这个map就是捕捉当前的err而已

0 回复 有任何疑惑可以回复我~
  • 提问者 remembers #1
    那之前的goroutine出的错就记录不了了,也没法终止runner.go中的select
    回复 有任何疑惑可以回复我~ 2020-03-28 13:51:41
  • 艾文西 回复 提问者 remembers #2
    之前的goroutine自然会有之前自己的err记录啊。
    回复 有任何疑惑可以回复我~ 2020-03-28 13:54:24
  • 提问者 remembers #3
    goroutine执行删除操作,局部的errMap.Range中很可能等不到err(因为goroutine很可能没来得及往errMap里写),然后就执行下一轮的runner.go中的select了。那么由于errMap是局部变量,所以新一轮的errMap接受不到之前一轮goroutine中的err,所以最终停下来的情况是VideoClearDispatcher中的if len(res) == 0,但是errMap.Range 这段逻辑就感觉没什么用了
    回复 有任何疑惑可以回复我~ 2020-03-28 14:01:51
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信