在提供的程式碼中,兩個循環變體表現出不同的行為當訪問切片中的元素時。 Loop1 重複返回“update”,而 Loop2 則列印預期的“刪除”、“更新”和“建立”序列。
理解這種差異的關鍵在於循環變數 (cmd) 在閉包 (func()) 中使用的方式。在 Loop1 中,對循環變數的引用儲存在閉包中。這表示對 cmd 的任何後續變更都會影響映射中的所有閉包。
當第二個循環執行時,cmd 的值已更新為“update”,即 cmds 切片中的最後一個元素。因此,映射中的所有閉包都會引用最後一個值,從而導致重複的「更新」輸出。
然而,在 Loop2 中,循環變數的副本是儲存在閉包中。這將創建一個獨立變量,該變量不受原始 cmd 的後續更改的影響。循環的每次迭代都會為 cmd2 分配一個不同的值,然後閉包會引用該值。
因此,第二個循環正確列印 cmds 切片的每個元素。
為了避免此類引用問題,通常建議在訪問閉包內的元素時使用切片的索引而不是循環變數。這樣,無論循環變數如何更改,每個閉包都可以存取正確的元素。
範圍循環返回的第二個值(元素的副本)當您想要將值傳遞給單獨的goroutine 或線程而不用擔心對原始變數的並發訪問時,這會很有用。這使得需要共享資料的任務變得很方便,而不必擔心損壞來源。
以上是為什麼 Golang 的循環行為在使用引用和循環變數副本時有所不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!