在 Go 1.21 中,当 for
循环中的闭包引用了循环变量时,编译器会自动将每次循环的变量快照传递给闭包。这样,闭包在执行时使用的是迭代过程中捕获的值,而不是循环结束后的变量最终值。
funcs := []func(){}
for i := 0; i < 3; i++ {
funcs = append(funcs, func() {
fmt.Println(i)
})
}
for _, f := range funcs {
f()
}
这样写是没问题的
在 Go 1.21 中,当 for
循环中的闭包引用了循环变量时,编译器会自动将每次循环的变量快照传递给闭包。这样,闭包在执行时使用的是迭代过程中捕获的值,而不是循环结束后的变量最终值。
funcs := []func(){}
for i := 0; i < 3; i++ {
funcs = append(funcs, func() {
fmt.Println(i)
})
}
for _, f := range funcs {
f()
}
这样写是没问题的