为了账号安全,请及时绑定邮箱和手机立即绑定

golang 发送一个 lambda 捕获组

golang 发送一个 lambda 捕获组

Go
尚方宝剑之说 2022-06-06 15:37:48
我使用了很多 c++,并且在使用它时我经常使用 lambdas。Lambda 有[<capturing group>](<parameters>) -> <return type> {}.在 golang 我知道 lambdas 只是var lambda_exp = func(<parameter list>) <return type> {}但我怎样才能复制捕获组?
查看完整描述

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 需要一些时间来适应。


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信