我比较新 要去 和有一些麻烦 与一些同时代码:
出于某种原因,其他区块执行两次,而程序恐慌则带有以下信息: panic:关闭闭路通道
,因为 expactedCh
第一次已经关闭。
func (ex Extractor) Extract(pageCh chan *types.ScrapedData, extractedCh chan *types.ScrapedData) {
log.Info().Msg("Extracting data...")
var wg sync.WaitGroup
for {
page, more := <-pageCh
if more {
wg.Add(1)
go func() {
defer wg.Done()
worker, err := ex.getWorker(page)
if err != nil {
log.Error().Err(err).Msg("Error creating worker")
} else {
worker.Extract(extractedCh)
}
}()
} else {
log.Info().Msg("WebPage channel closed: waiting for waitgroup")
wg.Wait()
log.Info().Msg("WaitGroup finished closed -- closing extractedCh")
close(extractedCh)
}
}
}
抽取函数只以一个运行程序运行 - 所以我不知道为什么其它块执行两次, 并试图关闭已经关闭的 < code> Exctracted Ch 。
答案是什么:我是要重组我的代码, 还是简单地检查频道关闭前是否关闭?