I'm seeing different behavior in my program that's tied to this particular loop in my program but I'm not sure I understand why it's behaving the way it is.
//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()
}
}
The output for loop1()
is
update
update
update
The output for loop2()
is
delete
update
create
I went looking on the internet and read the following
When ranging over a slice, two values are returned for each iteration. The first is the index, and the second is a copy of the element at that index
It says a copy, so does that mean it returns a copy of the string but it's really a pointer to variable cmd
? In which case any references to cmd
will by the end of the loop all actually reference the last element in the array, e.g. update
? Does this mean that elements of an array should always be referenced by their index when using the range
method, and what's the use case for using the element it returns since it's always updating the pointer?