使用通道时 goroutines 死锁

goroutines deadlock when using channels

我是 go lang 的新手,我正在尝试编写一个使用 goroutine 的简单递归算法。我正在使用通道从 goroutine 接收输出,但是当我尝试这样做时,我收到 "fatal error: all goroutines are asleep - deadlock!" 错误。如果我注释掉频道代码,一切都运行良好。 这是我的代码:

package main

import (
    "fmt"
    "sync"
)

func main() {
    numbers := []int{2, -1, 10, 4, 3, 6, 22}

    ch := make(chan []int)

    wg := &sync.WaitGroup{}
    wg.Add(1)
    go testFunc(numbers, ch, wg)
    wg.Wait()

    result := <-ch

    fmt.Println("Result: ", result)
}

func testFunc(numbers []int, ch chan []int, wg *sync.WaitGroup) {
    defer wg.Done()
    ch <- numbers
}

我做错了什么?我正在为 goroutine 中的通道分配值并在 main 中读取它。交流还不够吗?

仅当发送方和接收方都准备就绪时,无缓冲通道ch上的通信才会成功。

主函数在接收值之前在等待组上等待。 goroutine 尝试在调用 wg.Done 之前在通道上发送。这是一个僵局。

一种解决方法是使用缓冲通道:

     ch := make(chan []int, 1)

另一个修复方法是在调用 wg.Wait() 之前在频道上接收。

result := <-ch
wg.Wait()

还有一个修复方法是使用等待组删除所有行。在这个具体的例子中不需要它。