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 關注
- 150 瀏覽
添加回答
舉報