@Adrian В общем, да, но в этом случае команда является типом функции без параметров, поэтому использовать ее таким способом гораздо неудобнее.
у другое поведение в моей программе, которое связано с этим конкретным циклом в моей программе, но я не уверен, что понимаю, почему он ведет себя так, как есть.
//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
Я пошел смотреть наинтернет и прочитайте следующее
При определении диапазона по срезу для каждой итерации возвращаются два значения. Первый - это индекс, а второй - копия элемента с этим индексом.
Он говорит, что копия, значит ли это, что он возвращает копию строки, но это действительно указатель на переменнуюcmd
? В этом случае любые ссылки наcmd
будет к концу цикла все на самом деле ссылаться на последний элемент в массиве, например,update
? Означает ли это, что элементы массива всегда должны указываться их индексом при использованииrange
метод, и каков вариант использования возвращаемого элемента, поскольку он всегда обновляет указатель?