Это связано с концепцией закрытия. В основном переменные idx и x, которые вы используете внутри функции f , используют внешние переменные. Поэтому, когда функция фактически вызывается, она все еще «ссылается» на внешние переменные, которые были повторены до конца. Есть много решений, чтобы исправить это, для вашего кода одно исправление - назначить новые переменные внутри для l oop. В приведенном ниже коде a и b берет копию для каждой итерации и использует то же самое при вызове функции.
package main
import (
"fmt"
)
func main() {
a := []int{1, 2, 3}
var fs []func()
for idx, x := range a {
a := idx
b := x
f := func() {
fmt.Println(a, " ", b)
}
fs = append(fs, f)
}
for _, f := range fs {
f()
}
}
Этот код будет выводить
0 1
1 2
2 3
Вы можете увидеть некоторые детали в здесь .