golang通道在接收值之前死锁

golang通道在接收值之前死锁,go,Go,我不明白为什么这不起作用,但它起作用了 据我所知,goroutine异步地将to value true发送给a,将12发送给b。在主函数中,a被阻塞,直到它收到一个值。为什么当我将其重新排列为在a之前阻止b时,会导致死锁?默认情况下,Go通道是无缓冲的。这意味着在接收器读取通道之前,它无法在通道上发送。这实际上是Go首选模式。在大多数情况下,它比缓冲通道更有效 这对于您的第一个代码意味着goroutine在完成对通道a的写入之前无法继续写入通道b。在主goroutine读取a之前,它无法执行此操

我不明白为什么这不起作用,但它起作用了


据我所知,goroutine异步地将to value true发送给a,将12发送给b。在主函数中,a被阻塞,直到它收到一个值。为什么当我将其重新排列为在a之前阻止b时,会导致死锁?

默认情况下,Go通道是无缓冲的。这意味着在接收器读取通道之前,它无法在通道上发送。这实际上是Go首选模式。在大多数情况下,它比缓冲通道更有效

这对于您的第一个代码意味着goroutine在完成对通道a的写入之前无法继续写入通道b。在主goroutine读取a之前,它无法执行此操作。

举例来说,默认情况下,通道发送和接收等待,直到发送例程和接收例程都准备就绪。这种阻碍通过以下方式变得明显:

func main(){
ch:=制造(成交量)
寻求调试帮助的ch问题(“此代码为什么不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。
func main() {
    ch := make(chan int)
    ch <- 1
    fmt.Println(<-ch)
}