func main() {
messages := make(chan string)
go func() { messages <- "hello" }()
go func() { messages <- "ping" }()
msg := <-messages
msg2 := <-messages
fmt.Println(msg)
fmt.Println(msg2)
上述代码在我的终端上一致打印出“ping”和“hello”。 我对打印顺序感到困惑,因此想知道我思考的问题是否正确。
我了解未缓冲通道在等待发送者和接收者时会阻塞。因此,在上述情况下,当这两个Go例程被执行时,都没有接收器。因此,我猜想两个例程都会阻塞,直到通道上有接收器可用。
现在...我假设首先尝试将“hello”放入通道中,但必须等待...同时,“ping”也尝试了,但同样需要等待。然后
msg := <- messages
出现时,我会假设在这个阶段,程序将随意选择一个等待的 goroutine 并允许它将其消息发送到通道中,因为 msg 已经准备好接收。
然而,无论我运行程序多少次,似乎总是 msg 被分配为 "ping",而 msg2 被分配为 "hello",这给人留下了 "ping" 总是优先发送(到 msg)的印象。为什么会这样呢?
hello
总是先打印出来吗? - Himanshu