1 回答
TA贡献1795条经验 获得超7个赞
C++ 有一大堆繁琐的东西需要控制:
捕获了哪些变量
他们的一生可能是怎样的
它们是按价值还是按参考捕获的
等等。这些带有大量复杂的规则,你作为程序员必须遵守;如果你不这样做,你的代码行为是未定义的。结果是只有 C++ 高手才能维护的非常不清晰的代码,以及终身的工作保障。1
Go 缺乏所有这些复杂性。程序员被迫编写清晰而简单的代码:不会让读者感到困惑的代码。变量的生命周期由编译器和运行时自动计算。
好吧,对我们程序员来说幸运的是,有一点复杂性。形式的循环:
for i, item := range someslice {
go func() {
operateOn(i, &item)
}()
}
只有一个名为 的(共享)变量item,因此每个生成的 goroutine 都在处理同一个项目,其值在每次循环时被覆盖。这意味着你必须写得不太清楚:
for i, item := range someslice {
item := item
go func() {
operateOn(i, &item)
}()
}
(注意这i不是问题,因为它的值只是它的值,而不是指针;我在下面再次使用它)或者:
for i, item := range someslice {
go func(x T) {
operateOn(i, &x)
}(item)
}
在闭包内的局部变量中正确捕获项目。
1如果不是很明显,我真的很高兴 Go 代码如此简单明了。我对 C++ 编程的终身工作保障方面至少有点讽刺。在许多情况下,这些繁琐的东西确实使 C++ 具有内存效率并且不需要运行时 GC,但这只是一场噩梦。这就是为什么 Rust 的所有权模型存在的原因,但 Rust 需要一些时间来适应。
- 1 回答
- 0 关注
- 125 浏览
添加回答
举报