在 Go 中迭代切片時,使用 range 方法時可能會遇到意外行為。讓我們深入研究為什麼不同的循環變體會產生不同的結果。
考慮以下兩個for 循環變體:
loop1() { for _, cmd := range cmds { // Store a function literal that references the loop variable cmd actions[cmd] = func() { fmt.Println(cmd) } } }
loop2() { for i, cmd := range cmds { // Capture the loop variable cmd using a new variable command := cmds[i] actions[cmd] = func() { fmt.Println(command) } } }
運行這些循環結果在不同的輸出:
解釋
loop1() 出現問題是因為儲存在操作映射中的函數文字引用了循環變量cmd。當執行actions 映射中的函數時,它們都會列印「update」。 cmd。中儲存在操作映射中的每個函數都有它自己的循環變數副本,它允許每個函數列印正確的命令。重要的是要注意循環變量在所有迭代之間共享。以上是為什麼 Go 的「range」循環會因循環結構的不同而產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!