18 Функции
Что захватывает замыкание?
Ответ
Замыкание — это функция, которая видит переменные окружающего блока. Она держит сами переменные, а не копию на момент создания. С Go 1.22 у каждой итерации for собственная переменная цикла, поэтому замыкание внутри range видит значение этой итерации.
Подробнее
До Go 1.22 переменная цикла была одна на весь цикл. Замыкания, собранные в цикле, потом печатали последнее значение три раза. Обходной путь тех версий — v := v в теле итерации.
На Go 1.22 и новее пример ниже печатает a, b и c.
package main
import "fmt"
func main() {
values := []string{"a", "b", "c"}
funcs := make([]func(), 0, len(values))
for _, v := range values {
funcs = append(funcs, func() { fmt.Println(v) })
}
for _, fn := range funcs {
fn()
}
}