首頁 >後端開發 >Golang >為什麼 Go 的「range」循環會因循環結構的不同而產生不同的結果?

為什麼 Go 的「range」循環會因循環結構的不同而產生不同的結果?

Patricia Arquette
Patricia Arquette原創
2024-12-19 18:20:101045瀏覽

Why Does Go's `range` Loop Produce Different Results with Varying Loop Structures?

了解 Go 中不同的循環變體

在 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():列印“update”三次
  • loop2(): 列印“delete”、“update” ”,並“建立”

解釋

解釋

loop1() 出現問題是因為儲存在操作映射中的函數文字引用了循環變量cmd。當執行actions 映射中的函數時,它們都會列印「update」。 cmd。中儲存在操作映射中的每個函數都有它自己的循環變數副本,它允許每個函數列印正確的命令。重要的是要注意循環變量在所有迭代之間共享。

以上是為什麼 Go 的「range」循環會因循環結構的不同而產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn