【发布时间】:2017-06-23 07:48:01
【问题描述】:
我在我的程序中看到了与我的程序中的这个特定循环相关的不同行为,但我不确定我是否理解它为什么会这样。
//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并阅读以下内容
在切片上进行测距时,每次迭代都会返回两个值。第一个是索引,第二个是该索引处元素的副本
它说的是一个副本,那么这是否意味着它返回了一个字符串的副本,但它实际上是一个指向变量cmd 的指针?在这种情况下,对cmd 的任何引用都将在循环结束时实际引用数组中的最后一个元素,例如update?这是否意味着在使用range 方法时,数组的元素应该始终由它们的索引引用,以及使用它返回的元素的用例是什么,因为它总是在更新指针?
【问题讨论】:
标签: dictionary for-loop go closures slice