go - 为什么此代码会产生错误?

标签 go channel goroutine

为什么下面的代码会产生错误?

func main() {

    messages := make(chan string)

    messages <- "test" //line 16

    fmt.Println(<-messages)

}

生成以下错误。

fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
    /tmp/sandbox994400718/main.go:16 +0x80

一个值被发送到 channel ,并在下一行中被接收。从技术上讲,它应该可以工作。

最佳答案

channel 可以是缓冲非缓冲。缓冲 channel 可以在其“内部”存储多个项目,但是当您向缓冲 channel 添加内容时,添加项目的 goroutine 只有在另一个 goroutine 删除项目时才能继续。没有地方可以“留下”元素,它必须直接传递给另一个 goroutine,第一个 goroutine 会等到另一个 goroutine 从它那里拿走元素。

这就是您的代码中发生的事情。当您使用 make 创建 channel 时,如果您没有将容量指定为第二个参数,您将获得一个无缓冲 channel 。要创建缓冲 channel ,请将第二个参数传递给 makee.g .

messages := make(chan string, 1) // could be larger than 1 if you want

这允许 goroutine 将项目(在本例中为 string)添加到 channel ,当另一个 goroutine 将来尝试从 channel 获取项目时,它将可用,并且然后原始 goroutine 可以继续处理。

关于go - 为什么此代码会产生错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33589980/

相关文章:

go - `Listen` 和 `ListenTCP` 之间有什么不同?

installation - 未找到软件包错误 : The following packages are not available from current channels:

recursion - 我如何阻止(和加入)由未知数量的 goroutines 提供的 channel ?

go - 这段代码会不会在 Go1.5 的 GC 之后引起 panic?

go - 如何迭代列表并使用 goterm 包绘制表格?

go - emacs 中 golang 的自动完成

go - 同时从两个不同的 goroutine 调用一个方法是否安全?

concurrency - Go并发和 channel 困惑

json - 如何在结构中定义多个名称标签

go - 为什么 golang 中的 select 只适用于 goroutine 中的 channel ?