转到频道未死锁或锁定

时间:2018-06-23 14:38:02

标签: go

我有一小段这样的代码

func main() {
    var c chan string
    go func() {
        c <- "let's get started"//write1
        //c <- "let's get started"//write2
        //c <- "let's get started"//write3
        fmt.Println("wrote the stuff....")
    }()
    //time.Sleep(3 * time.Second) //adding this always shows fatal exception
    c = make(chan string)
    fmt.Println(<-c)
}

如果取消注释wrote the stuff....//write2代码段行,则在控制台上看不到输出write3。我知道可能看不到这是因为该通道是无缓冲的并且完全同步的,并且在该通道之外仅发生了一次读取。但是,当程序退出时,go例程将被阻止,为什么在我看到的这种情况下没有出现deadlocked...之类的错误?

2 个答案:

答案 0 :(得分:6)

在尝试写入之前在之前创建通道。如果func goroutine在实际存在某个通道之前尝试通过c发送元素,它将最终使用nil通道,该通道将永远阻塞。

答案 1 :(得分:-2)

这是一个有趣的实验。我不知道是否可能,但是编译器应该捕获这种类型的错误,应该有一个功能可以在编译时检查nil通道中是否有任何内容。