我有一些代码:
...
func Run(tasks []Task, n, m int) error {
...
for i := 0; i < n; i++ {
go func() {
defer wg.Done()
for t := range taskCh {
if atomic.LoadInt32(&errCount) >= int32(m) {
return
}
if err := t(); err != nil {
atomic.AddInt32(&errCount, 1)
}
}
}()
}
for _, t := range tasks {
taskCh <- t
}
close(taskCh)
wg.Wait()
if atomic.LoadInt32(&errCount) >= int32(m) {
err = ErrErrorsLimitExceeded
}
...
}
它的工作很好,但为什么它不工作时,我写操作关闭()wg。等待,如果.推迟了吗
...
defer func() {
close(taskCh)
wg.Wait()
if atomic.LoadInt32(&errCount) >= int32(m) {
err = ErrErrorsLimitExceeded
}
}()
for i := 0; i < n; i++ {
...
当变量errCount = 0时
1条答案
按热度按时间sxpgvts31#
这是golang的限制,你不能改变从defer函数返回的变量。正确的做法是(注意
(err error)
命名返回值):https://goplay.tools/snippet/9fwcqTIwhow