执行:致命错误:所有goroutine都处于睡眠状态-死锁

Gam*_*007 1 deadlock go

我有一个只有一行单词的文本文件。我想将所有这些单词分别存储在一个通道中,然后从通道中将它们全部提取出来并一一打印出来。我有以下代码:

func main() {
    f, _ := os.Open("D:\\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)   
    for scanner.Scan() {
        line := scanner.Text()

        // Split the line on a space
        parts := strings.Fields(line)

        for i := range parts {   
            file1chan <- parts[i]
        }    
    }
    print(file1chan)
}

func print(in <-chan string) {
    for str := range in {
        fmt.Printf("%s\n", str)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,出现以下错误:

致命错误:所有goroutine都在睡着-死锁!

goroutine 1 [chan send]:main.main()

我尝试在线查找它,但仍然无法解决。谁能告诉我为什么会这样,我该如何解决呢?

谢谢!

Fil*_*und 5

file1chan的帐户没有缓冲,因此当您尝试通过该通道发送值时,它将永远阻塞,等待有人获取值。

您需要启动一个新的goroutine,或者缓冲通道并将其用作数组。这是带有另一个goroutine的版本:

func main() {
    f, _ := os.Open("D:\\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    go func() { // start a new goroutine that sends strings down file1chan 
        for scanner.Scan() {
            line := scanner.Text()

            // Split the line on a space
            parts := strings.Fields(line)

            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    print(file1chan) // read strings from file1chan
}

func print(in <-chan string) {
    for str := range in {
        fmt.Printf("%s\n", str)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是缓冲版本,仅用于处理单个字符串:

func main() {
    f, _ := os.Open("D:\\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string, 1) // buffer size of one
    for scanner.Scan() {
        line := scanner.Text()

        // Split the line on a space
        parts := strings.Fields(line)

        for i := range parts {
            file1chan <- parts[i]
        }
    }
    close(file1chan) // we're done sending to this channel now, so we close it.
    print(file1chan)
}

func print(in <-chan string) {
    for str := range in { // read all values until channel gets closed
        fmt.Printf("%s\n", str)
    }
}
Run Code Online (Sandbox Code Playgroud)