首頁 > 後端開發 > Golang > 為什麼 Golang 的 For 迴圈在使用閉包時會產生不同的輸出?

為什麼 Golang 的 For 迴圈在使用閉包時會產生不同的輸出?

DDD
發布: 2024-12-14 19:42:17
原創
412 人瀏覽過

Why Do Golang's For Loops Produce Different Outputs When Using Closures?

了解Golang 中的不同循環行為

在此程式碼中,我們建立了兩個for 迴圈(loop1 和Loop2),它們迭代一段字串(cmd )。但是,這些循環的結果輸出有所不同。

Loop1:意外輸出

在循環 1 中,迭代 cmd 後,會建立一個映射(操作),其中每個命令都對應到一個函數,該函數列印命令。當這些函數執行時,它們都會列印“update”,這是 cmds 中的最後一個元素。

Loop2: Desired Output

在loop2中,採用了類似的方法,但不是儲存操作映射中的直接命令引用,使用其索引建立命令的副本。這確保每個函數都有自己的命令副本,從而防止loop1出現意外的「更新」輸出。

解釋

loop1中的特殊行為是由於閉包(儲存在中的函數)的方式而發生的actions map)引用循環變數。

  • 在loop1中,cmd是一個循環變量,在每次迭代中都會被修改。當在循環內建立函數時,它們會引用此循環變數。
  • 但是,循環完成後,循環變數 cmd 不再可訪問,所有函數都引用它保存的最後一個值(「update」) ).

透過為每個函數建立循環變數的副本(如loop2中所做的那樣),每個函數都有自己的獨立變量,該變數不受後續循環的影響

結論

這個範例強調了Golang 中變數作用域的重要性以及循環變數和複製所建立的分離變數之間的差異。當使用引用循環變數的閉包時,請確保建立副本以防止因變數重複使用而導致的意外行為至關重要。

以上是為什麼 Golang 的 For 迴圈在使用閉包時會產生不同的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板