Concurrency 重用Go通道会导致死锁

Concurrency 重用Go通道会导致死锁,concurrency,go,channel,Concurrency,Go,Channel,我是新来的golang(有Javaconcurrency后台)。考虑代码的和平: package main import "fmt" func sendenum(num int, c chan int) { c <- num } func main() { c := make(chan int) go sendenum(0, c) x, y := <-c, <-c fmt.Println(x, y) } 我知道,添加另一个go s

我是新来的
golang
(有
Java
concurrency后台)。考虑代码的和平:

package main

import "fmt"

func sendenum(num int, c chan int) {
    c <- num
}

func main() {
    c := make(chan int)
    go sendenum(0, c)
    x, y := <-c, <-c
    fmt.Println(x, y)
}
我知道,添加另一个
go sendenum(0,c)
语句可以解决这个问题。。。但是


死锁发生在何时和何地?

在它收到0后,
main
继续等待
c
的接收端,等待另一个值到达(放入
y
变量),但它永远不会,因为运行
main
的goroutine是唯一存活的


当您添加另一个
go sendenum(0,c)
时,它实际上会在第二个通道接收上获取一个值,将其放入
y
变量,打印出
x
y
,程序成功完成。

在它接收到0之后,
main
一直在
c
的接收端等待另一个值到达(放入
y
变量),但它永远不会到达,因为运行
main
的goroutine是唯一还活着的

当您添加另一个
go sendenum(0,c)
时,它实际上会在第二个通道接收时获取一个值,将其放入
y
变量,打印出
x
y
,程序就会成功完成。

并不是说“重用”通道是个问题。这只是发生了一个简单的死锁,因为代码规定了对同一通道的两次读取,但只有一次写入。第二次读取永远不会发生,因此会出现死锁。

并不是“重用”通道是个问题。这只是发生了一个简单的死锁,因为代码规定了对同一通道的两次读取,但只有一次写入。第二次读取永远不会发生,因此会出现死锁

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
    /home/tarrsalah/src/go/src/github.com/tarrsalah/stackoverflow/chan_dead_lock.go:12 +0x90
exit status 2