Go 关闭捕获的变量和共享数据?

我刚刚观察并确认 Go 闭包通过引用捕获外部变量。如果变量被捕获到一个 Goroutine 中并且如果 Goroutine 复用到不同的线程中,

  • 修改闭包中的值是否安全?

  • 如果它不安全,为什么 Go 不阻止这种情况发生?

  • 或者它是否采用了某种安全机制?(比如锁)


慕盖茨4494581
浏览 213回答 1
1回答

精慕HU

正如您所注意到的,Go 确实通过闭包中的引用来捕获外部变量。修改闭包中的值是否安全?它是一个变量,就像任何其他变量一样,因此适用于普通 Go 代码中的相同规则。修改它是安全的,但是如果您同时修改它,那么您需要提供自己的锁定或使用原子类型。有关完整详细信息,请参阅Go Memory 模型。如果不安全,为什么不去阻止这种情况?这与访问 go 例程之间共享的任何其他变量没有什么不同。你可以安全地做,也可以不安全地做——如果你愿意,Go 让你可以自由地用脚射击!Go 有一个出色的竞争检测器,它可以发现并发变量访问问题。或者它是否使用了一些安全机械?(比如锁)不。Go 永远不会为你锁定东西——你需要使用同步包中提供的原语或遵循 Go 的哲学:不要通过共享内存进行通信;相反,通过通信共享内存,即使用通道在 goroutines 之间说话。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go