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 關注
- 81 瀏覽
添加回答
舉報