Goroutine 和 for 循环

Goroutine and for loop

我只想从 main() 函数发送一个值到通道和 return 并在我从通道 ch 收到一个值后立即退出程序.

但这会让 运行ning 永远:

ch := make(chan int)

for {
    go func() {
        ch <- 1
    }()
}

<-ch

我从通道收到一个值后,如何return使用这个for循环?

为什么这会 运行 永远?

Go playgroundlink来了

http://play.golang.org/p/EvmT6Pw96Y

自从 for 循环 运行 永远存在,您的代码 运行 永远存在。从未到达 for 循环后从 ch 接收。

如果你想让你的代码在某个时候退出,你必须在某个时候结束 for 循环,例如使其 运行 仅迭代一定次数:

for i := 0; i < 5; i++ {
    ...
}

因此,如果您仅 运行 5 次迭代(如在我的示例中),在 for 循环从 ch 接收后将执行,这可能会阻塞(因为 ch 是无缓冲的)如果其他 goroutines 还没有 运行,并且至少有一个启动的 goroutines 将被执行,它在通道上发送一个值,这可能会触发主 goroutine 继续(因为它的阻塞操作不再阻塞)。

另请注意,Go Memory Model 仅保证某些事件先于其他事件发生,您无法保证 2 个并发 goroutine 的执行方式。您无法保证在 for 循环中启动的 goroutines 将在主 goroutine 在接收来自 ch.

时被阻塞之前开始执行

通常当一个 goroutine 被阻塞时(例如阻塞通道接收操作),运行time 可能会调度另一个 goroutine 到 运行。