我在我的程序中看到了與我的程序中的特定循環綁定的不同行爲,但我不確定我是否理解爲什麼它的行爲方式如此。爲什麼這兩個for循環變體給我不同的行爲?
//global variable
var cmds = []string {
"create",
"delete",
"update",
}
func loop1() {
actions := make(map[string]func())
for _, cmd := range cmds {
actions[cmd] = func() {
fmt.Println(cmd)
}
}
for _, action := range actions {
action()
}
}
func loop2() {
actions := make(map[string]func())
for i, cmd := range cmds {
command := cmds[i]
actions[cmd] = func() {
fmt.Println(command)
}
}
for _, action := range actions {
action()
}
}
爲loop1()
輸出
update
update
update
爲loop2()
輸出是
delete
update
create
我去尋找在internet和閱讀下列
當rangi在切片上,每次迭代返回兩個值。第一個是指數,第二個是指數
在元素的副本,它說的副本,這是否意味着它返回字符串的副本,但它的確是一個指針變量cmd
?在這種情況下,在循環結束時對cmd
的任何引用都實際上引用數組中的最後一個元素,例如, update
?這是否意味着在使用range
方法時應始終使用索引引用數組的元素,以及使用返回的元素的用例是什麼,因爲它始終更新指針?
的可能的複製[捕獲閉幕(用於循環變量)在圍棋](https://stackoverflow.com/questions/26692844/captured-closure-for-loop-variable -in-go) – Adrian