Gorountines 导致死锁

Gorountines causing a deadlock

我正在尝试 goroutines 并想出了这个例子 - https://go.dev/play/p/mWHUmALk-1_K

但是我遇到了这个错误 - fatal error: all goroutines are asleep - deadlock!

我试图解决这个问题,但没有成功。请问我该如何解决?

错误似乎在第 15、23 和 32 行。

问题是您的程序启动了 3 个单独的 goroutine,这些 goroutine 发送到同一个频道。而且您只有主 goroutine 从该频道接收一次。这会导致第二个通道发送 (ch <- fmt.Sprintf("...) 无限期阻塞。使用无缓冲通道,您需要接收和发送一样多的数据。

确保接收到所有发送的一种方法是在通道上使用 range 循环。

func getLength(dd []string, wg *sync.WaitGroup) {
    wg.Add(len(dd))
    c := make(chan string)
    for _, d := range dd {
        d1 := d
        go computeLength(d1, c, wg)
    }

    // close c once all goroutines are done to
    // ensure the for-range loop below exits.
    go func() { wg.Wait(); close(c) }()

    // Use for-range loop on the channel to receive all the sends.
    //
    // But note that a for-range loop over a channel exits only
    // when the channel is closed or the loop is exited from within.
    //
    // So to exit you can close c once wg.Wait() returns,
    // that's why there's that extra goroutine above.
    for v := range c {
        fmt.Println(v)
    }
}

https://go.dev/play/p/BUb7NHrq2B0