2 回答

TA貢獻1830條經驗 獲得超3個贊
該walker通道是無緩沖的。在發送方和接收方準備就緒之前,無緩沖通道上的通信不會繼續進行。
死鎖是這樣的:主 goroutine 通過調用 wg.Done() 等待 walker goroutine 完成。walker goroutine 等待主 goroutine 在通道上接收。
通過刪除與等待組相關的所有代碼來修復程序。不需要等待組。在主 goroutine 中的通道范圍不會完成,直到通道被 walker goroutine 關閉。在步行完成之前,walker goroutine 不會關閉通道。不需要其他協調。
您還可以通過刪除 goroutine 和通道來修復代碼:
err := filepath.Walk(srcFolder, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
// Insert body of for path := range walker here ...
fmt.Println(path)
return nil
})
if err != nil {
log.Fatal(err)
}
另一種選擇是創建一個容量大于將要遍歷的文件數量的緩沖通道,但這需要提前知道文件數量,并且與在切片中收集文件名相比沒有任何好處。

TA貢獻1833條經驗 獲得超4個贊
如所寫(和所示),在運行循環之前絕對不能調用。您可以(但不需要)在循環終止時調用。您根本不需要該變量。wg.Wait()
for path := range walker
wg.Wait()
wg
你的評論說:
//?THE?GO?routine?above?needs?to?have?finished?by?the?time?this?for?loop? //?ranges?over?the?channel
但是循環中沒有任何東西for
要求函數完成,并且有一些東西(這里的總體策略)要求 goroutine不能在 send 中被阻塞,因為for
只有當發送者(goroutine)時循環才會完成。關閉通道。
- 2 回答
- 0 關注
- 167 瀏覽
添加回答
舉報