为什么此通道操作会显示死锁错误?

时间:2017-03-22 07:48:17

标签: go

package main

import "fmt"

var money int = 100
var update  = make(chan int) 

func updateM( count int)  {
    update<- count
}

func main() {
    updateM(200)
    fmt.Println(<-update)

}

但当我更改代码以在updateM(200)前添加go 然后没有错误

func main() {
        go updateM(200)
        fmt.Println(<-update)

    }
谁能告诉我,我是Go的新学习者。非常感谢。

2 个答案:

答案 0 :(得分:4)

来自documentation

如果通道未缓冲,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方仅阻塞,直到将值复制到缓冲区为止;如果缓冲区已满,则表示等待某个接收方检索到一个值。

您可以通过将频道创建更改为

来使其无法阻止
var update  = make(chan int, 1)

这样在频道阻止之前,频道中的一个项目就有空间。

答案 1 :(得分:2)

对无缓冲通道的写入将阻塞,直到有人在另一端读取它。在你的情况下updateM将无限期地阻止,因为要继续,它需要继续,以便它可以从通道读取,它不能,因为它不是从通道读取。

频道用于goroutines之间的通信,它们与自己交谈没有意义。