为什么 goroutine 中的无缓冲通道会得到这个顺序



我正在编写一些带有goroutines和通道的golang并发代码 这是我的代码:

package main
import "fmt"
func main() {
in := make(chan int)
go func() {
fmt.Println("Adding num to channel")
in <- 1
fmt.Println("Done")
}()
val := <- in
fmt.Println(val)
}

我做了一个无缓冲的通道,在我看来,里面的通道必须等到外面的通道读取它,输出可能是这样的:

Adding num to channel
1
Done

但实际上,输出是:

Adding num to channel
Done
1

我很困惑,为什么内部无缓冲通道只是运行而不等待读取

您对输出的解释不正确。goroutine确实写入了通道,此时主goroutine确实读取了,但是"Done"的printf在值的printf之前执行。

同步操作在 goroutines 之间建立"之前发生"的关系。当 goroutine 写入通道时,在通道写入之前唯一可以保证发生的事情是 goroutine中的第一个 println。一旦通道写入和相应的读取完成,剩下的 goroutine 和主 goroutine 就可以按任意顺序执行。

在您的情况下,goroutine在主goroutine之前执行。

最新更新