编辑::完整代码here
我有以下代码:
filelistchan := make(chan string)
for _, dir := range tld {
w.Add(1)
go GetFileList(dir, filelistchan, w)
}
for ;; {
file, ok := <- filelistchan
fmt.Println(ok)
switch ok {
case false:
break
default:
fmt.Println(file)
}
}
w.Wait()
和GetFileList函数是
func GetFileList(dir string, filelistchan chan string, w sync.WaitGroup) {
defer fmt.Println("finishing from", dir)
defer w.Done()
fmt.Println("Searching in", dir)
filelist := []string{}
filepath.Walk(dir, func(path string, f os.FileInfo, err error) error{
filelist = append(filelist, path)
return nil
})
for _, file := range filelist {
fmt.Println(file)
filelistchan <- file
}
}
我在forloop中并行调用GetFileList
函数,以获取其中的文件列表。它工作正常,直到最后一个目录,但是,一旦完成最后一个目录,它会给出错误
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
当我打印好的时候,我可以看到,一旦完成工作,就永远不会从goroutine打印出来。我无法弄清楚我在这里做错了什么。我在close(filelistchan)
函数中尝试了GetFileList
,但在第一个goroutine退出后又出现了另一个错误,即write on closed channel
和attempting to close a closed channel
。有人可以解释,有什么最好的惯用方法来实现这个目的吗?