Закрытие Голанга не хранит захваченные переменные? - PullRequest
0 голосов
/ 15 ноября 2018

В этом блоке кода ниже, я ожидаю, что выходные данные будут 0, 1, 2, 3, ..., 9. Однако, только выходные данные 10, 10, ..., 10 производятся.

package main

import "fmt"

func adder() []func() {
    out := []func(){}
    for i := 0; i < 10; i++ {
        out = append(out, func() { fmt.Println(i) })
    }

    return out
}

func main() {
    out := adder()
    for i := 0; i < 10; i++ {
        out[i]()
    }
}

Моя ментальная модель предполагает, что новая функция генерируется и сохраняется каждый раз в цикле for, но, похоже, это не так.Есть ли решение для генерации новых функций без изменения сигнатуры (без параметров или глобальных переменных), но с сохранением текущего значения i?

1 Ответ

0 голосов
/ 15 ноября 2018

Новая функция - это , создаваемая при каждой итерации, но все они закрываются по одной и той же переменной i. Эта переменная обновляется с каждой итерацией до последней, поэтому, когда вы выполняете и выполняете все эти функции, все они ссылаются на один и тот же i с одинаковым значением 10.

Если вам не нужно такое поведение, вы должны не закрывать переменную цикла:

for i := 0; i < 10; i++ {
    temp := i
    out = append(out, func() { fmt.Println(temp) })
}
...