为什么下面的代码会产生错误?
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 ,请将第二个参数传递给 make
,e.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/