使用 golang 频道。获得 "all goroutines are asleep - deadlock!"

using golang channels. GETTING "all goroutines are asleep - deadlock!"

我目前正在研究围棋例程、频道和 sync.WaitGroup。我知道 waitgroup 用于根据天气等待所有 go 例程完成 wg.Done() 已被调用足够多次以减少 wg.Add() 中设置的值。 我写了一小段代码来尝试在 golang 操场上测试这个。显示如下

var channel chan int
var wg sync.WaitGroup


func main() {

  channel := make(chan int)
  mynums := []int{1,2,3,4,5,6,7,8,9} 
  wg.Add(1)

  go addStuff(mynums)
  wg.Wait()
  close(channel)
  recieveStuff(channel)
 }

 func addStuff(mynums []int) {

   for _, val := range mynums {
       channel <- val
   }
   wg.Done()
 }

 func recieveStuff(channel chan int) {
    for val := range channel{
    fmt.Println(val)
 }
} 

我收到死锁错误。我正在尝试使用 wg.Wait() 等待到 return 的路由?然后,关闭通道。之后,将通道发送到recievestuff方法输出切片中的值?但它不起作用。我尝试在循环之后将 close() 方法移动到 go 例程中,因为我认为我可能一直在尝试关闭 main() 中的错误例程。到目前为止,我发现这些东西相对令人困惑,来自 java 和 c#。任何帮助表示赞赏。

wg.Done() 被调用一次之前,对 wg.Wait() 的调用不会 return。

addStuff() 中,当没有其他 goroutine 耗尽这些值时,您将值写入通道。由于通道是无缓冲的,第一次调用 channel <- val 会永远阻塞,导致死锁。

此外,addStuff() 中的通道保持为 nil,因为您正在 main 中创建一个新的变量绑定,而不是分配给包级变量。写入 nil 通道永远阻塞:

channel := make(chan int) //doesn't affect the package-level variable

这是一个修改后的示例,它通过消耗通道中的所有值来运行完成:

https://play.golang.org/p/6gcyDWxov7