gpt4 book ai didi

Golang channel 输出顺序

转载 作者:IT王子 更新时间:2023-10-29 01:50:44 26 4
gpt4 key购买 nike

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”。我对打印的顺序感到困惑,所以我想知道是否可以澄清我的想法。

我知道无缓冲 channel 在等待发送者和接收者时会阻塞。所以在上面的例子中,当这两个 go 例程被执行时,在这两种情况下都没有接收者。所以我猜测这两个例程都会阻塞,直到 channel 上有可用的接收器。

现在……我假设第一个“hello”尝试进入 channel ,但必须等待……与此同时,“ping”尝试,但又必须等待。然后

msg := <- messages

出现,所以我假设在那个阶段,程序将任意选择一个等待的 goroutine 并允许它将其消息发送到 channel 中,因为 msg 已准备好接收。

但是,似乎无论我运行该程序多少次,它总是被分配为“ping”的 msg 和被分配为“hello”的 msg2,这给人的印象是“ping”总是优先发送首先(发信息)。这是为什么?

最佳答案

这与读取 channel 的顺序无关,而是与无法保证的 goroutines 执行顺序有关。

尝试从您写入 channel 的函数中“打印”(写入之前和之后),我认为它应该与从 channel 读取的顺序相同。

关于Golang channel 输出顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50654576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com