Go问答 线程通道问题

dbas · 2020年08月13日 · 最后由 kevin 回复于 2020年08月13日 · 223 次阅读
package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    // 并行遍历文件树的每个根
    roots := "E:/Office2017_4n1/Office2017(4n1)"
    fileSizes := make(chan int64)
    go walkDir(roots, fileSizes)

    for {

        select {
        case x := <-fileSizes:
            fmt.Println(x)

        }

    }
    close(fileSizes)

}

func walkDir(dir string, fileSizes chan<- int64) {

    for _, entry := range dirents(dir) {
        if entry.IsDir() {

            subdir := filepath.Join(dir, entry.Name())
            fmt.Println(subdir)
            go walkDir(subdir, fileSizes)
        } else {
            fmt.Println(entry.Name())
            fileSizes <- entry.Size()
        }

    }
}

func dirents(dir string) []os.FileInfo {
    f, err := os.Open(dir)
    if err != nil {

        fmt.Println("error:", err)
    }
    defer f.Close()
    entries, err := f.Readdir(0)
    if err != nil {
        fmt.Println("error:", err)

    }
    //fmt.Println(entries)
    return entries

}

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

这个报错信息很详细的呀,因为你这里执行完成之后主 goroutine 会继续等待 channel 提供数据(但是提供的 channel 数据的 goroutine 已经退出了)

只需要修改一下就可以正常运行了:

https://play.golang.org/p/3ZE-sr0cqh9

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册