golang派了一个lambda捕获小组 我使用了大量的C++,而且在使用时我经常使用lambda。兰博达斯有 [<capturing group>](<parameters>) -> <return type> {}.

golang派了一个lambda捕获小组 我使用了大量的C++,而且在使用时我经常使用lambda。兰博达斯有 [<capturing group>](<parameters>) -> <return type> {}.,go,lambda,Go,Lambda,在golang我知道Lambda只是 var lambda_exp = func(<parameter list>) <return type> {} 但是我如何复制捕获组呢?C++有一大堆复杂的东西需要控制: 捕获哪些变量 他们的一生会是怎样的 它们是通过值还是通过引用捕获的 等等。这些都伴随着大量复杂的规则,作为程序员,你必须遵守这些规则;如果没有,则代码行为未定义。其结果是一个完全不清楚的代码,只有一个主C++程序员可以维护,并且工作安全终身。1 Go缺少所有这些

在golang我知道Lambda只是

var lambda_exp = func(<parameter list>) <return type> {}

但是我如何复制捕获组呢?

C++有一大堆复杂的东西需要控制:

捕获哪些变量 他们的一生会是怎样的 它们是通过值还是通过引用捕获的 等等。这些都伴随着大量复杂的规则,作为程序员,你必须遵守这些规则;如果没有,则代码行为未定义。其结果是一个完全不清楚的代码,只有一个主C++程序员可以维护,并且工作安全终身。1 Go缺少所有这些复杂性。程序员被迫编写清晰而简单的代码:不会让读者感到困惑的代码。编译器和运行时会自动计算变量的生存期

嗯,幸运的是,对于我们程序员来说,有一点复杂性。表单的循环:

对于i,item:=范围someslice{ 围棋{ operateOni和item } } 只有一个名为item的共享变量,因此生成的每个goroutine都处理同一个项,其值在循环的每次行程中都会被覆盖。这意味着您必须写一些不太清楚的内容:

对于i,item:=范围someslice{ 项目:=项目 围棋{ operateOni和item } } 请注意,我不是一个问题,因为它的值只是它的值,而不是指针;我在下面再次使用它,或者:

对于i,item:=范围someslice{ 去函数{ 操作i和x }项目 } 在闭包内的局部变量中正确捕获项


1如果不是很明显,我真的很高兴Go代码如此简单明了。我至少对C++编程中的工作安全性有点讽刺。在很多情况下,这些简单的东西确实允许C++高效内存,不需要运行时GC,但这只是一个噩梦。例如,这就是Rust的所有权模型存在的原因,但Rust需要一些时间来适应。

Go中的变量在使用时会自动捕获,无需声明要捕获的变量。看见