我正在学习Go,但遇到一种我无法真正理解的现象。我正在遍历具有多个功能的for循环。我想将它们放入包装器中,这是一个匿名函数。然后将该包装器存储到列表中。
使用此列表后,所有元素都包含相同的实例-最后一个。在检查了实例的地址之后,我注意到包装器函数始终具有相同的地址。
对于一个普通实例,我只想创建一个新实例,例如new(),但是如何使用函数呢?当我在循环外部创建一个具有内部函数作为参数的命名函数,并返回包装器并改用该命名函数时,它会工作(代码2)。但是,如果没有此辅助功能,是否有可能做到这一点?
错误代码:
type Callable func()
var (
callableList1 = []Callable{
func() { log.Println("A") },
func() { log.Println("B") },
func() { log.Println("C") },
}
callableList2 []Callable
)
func main() {
for _, callable := range callableList1 {
wrapper := func() {
callable()
}
log.Printf("- %v %v\n", wrapper, callable)
callableList2 = append(callableList2, wrapper)
}
for _, a := range callableList2 {
a()
}
}
具有辅助功能(代码2)
func main() {
for _, callable := range callableList1 {
wrapper := makeWrapper(callable)
log.Printf("- %v %v\n", wrapper, callable)
callableList2 = append(callableList2, wrapper)
}
for _, a := range callableList2 {
a()
}
}
func makeWrapper(inner Callable) Callable {
return func() {
inner()
}
}
编辑:标记的问题是不同的。这里的问题是如何在迭代中更改值。我不会更改来源清单。我正在创建一个匿名函数,但没有将其存储在origin集合中,而是将其存储在另一个函数中。 我的问题是,即使我尝试创建一个新的包装,为什么包装器总是使用相同的地址。