亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號