【发布时间】:2016-09-06 08:08:06
【问题描述】:
考虑以下go playground
package main
import "fmt"
func main() {
messages := make(chan string)
messages <- "my msg"
select {
case msg := <-messages:
fmt.Println("received message", msg)
}
}
上面的代码会报错
fatal error: all goroutines are asleep - deadlock!
然而
如果我把它改成
package main
import "fmt"
func main() {
messages := make(chan string)
go func() {
messages <- "my msg"
}()
select {
case msg := <-messages:
fmt.Println("received message", msg)
}
}
它会起作用的。
这种行为有什么特殊原因吗?
代码不应该在第一种情况下按顺序执行,以便在到达 select 语句时,将传递 msg 并捕获 case msg := <-messages 吗?
【问题讨论】: