我在我的程序中看到了与我的程序中的特定循环绑定的不同行为,但我不确定我是否理解为什么它的行为方式如此。为什么这两个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