我是lang的新手,我正在尝试编写一个使用goroutines的简单递归算法。我正在使用频道从goroutine接收输出,但是当我尝试这样做时,我收到了#34;致命错误:所有goroutines都睡着了 - 死锁!"错误。如果我注释掉频道代码一切正常。 这是我的代码:
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中读取它。那不足以沟通吗?
答案 0 :(得分:4)
只有当发送方和接收方都准备就绪时,无缓冲信道ch
上的通信才会成功。
主函数在接收值之前等待等待组。 goroutine尝试在调用wg.Done之前发送通道。这是一个僵局。
一种解决方法是使用缓冲通道:
ch := make(chan []int, 1)
另一个解决方法是在调用wg.Wait()之前在频道上接收。
result := <-ch
wg.Wait()
另一个修复方法是使用等待组删除所有行。在这个具体的例子中不需要它。