Все вопросы

18 Функции

Что захватывает замыкание?

Замыкание — это функция, которая видит переменные окружающего блока. Она держит сами переменные, а не копию на момент создания. С Go 1.22 у каждой итерации for собственная переменная цикла, поэтому замыкание внутри range видит значение этой итерации.

До Go 1.22 переменная цикла была одна на весь цикл. Замыкания, собранные в цикле, потом печатали последнее значение три раза. Обходной путь тех версий — v := v в теле итерации.

На Go 1.22 и новее пример ниже печатает a, b и c.

Пример

Go

по функции на каждое значение

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()
    }
}