在for循环中创建匿名函数

时间:2019-07-07 19:16:28

标签: go

我正在学习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集合中,而是将其存储在另一个函数中。 我的问题是,即使我尝试创建一个新的包装,为什么包装器总是使用相同的地址。

0 个答案:

没有答案