Goroutine存储通道值没有死锁

时间:2019-03-15 03:11:54

标签: go

此代码运行并结束,没有死锁错误。为什么?

func main() {
    ch := make(chan int)
    go func() {
        ch<-1
        ch<-2
    }()

    time.Sleep(time.Second)
}

1 个答案:

答案 0 :(得分:2)

未缓冲的通道需要两个端点才能工作,所以让我们从正确的示例开始:

package main

func main() {
    go fun2()
    <-ch
    <-ch
}
func fun2() {
    ch <- 1
    ch <- 2
}

var ch = make(chan int)

这里fun2()发送两个值,main()接收两个值。


您的示例代码只有一个端点,因此通道构造不正确,因此它是死锁,但是main goroutines正常退出,因此您看不到错误。在这里,没有第二个终点,所以这是死锁:

package main

func main() {
    var ch = make(chan int)
    ch <- 1
}

输出:

fatal error: all goroutines are asleep - deadlock!