среда, 13 мая 2020 г.

Анонимные функции и замыкания в Golang

Литерал функции (или лямбда) - это функция без имени.

В этом примере литерал функции передается в качестве аргумента less функции sort.Slice.

func Slice(slice interface{}, less func(i, j int) bool)

people := []string{"Alice", "Bob", "Dave"}
sort.Slice(people, func(i, j int) bool {
    return len(people[i]) < len(people[j])
})
fmt.Println(people)
// Вывод: [Bob Dave Alice]

Вы также можете использовать промежуточную переменную.

people := []string{"Alice", "Bob", "Dave"}
less := func(i, j int) bool {
    return len(people[i]) < len(people[j])
}
sort.Slice(people, less)

Обратите внимание, что функция less является замыканием: она ссылается на переменную people, которая объявлена ​​вне функции.

Замыкания

Литералы функций в Go являются замыканиями: они могут ссылаться на переменные, определенные в окружающей функции. Такие переменные

  • являются общими между окружающей функцией и литералом функции,
  • сохраняются в памяти, пока к ним можно получить доступ.

В этом примере литерал функции использует локальную переменную n из окружающей области видимости, чтобы подсчитать, сколько раз он был вызван.

// New возвращает функцию Count.
// Count печатает количество раз, которое она был вызван.
func New() (Count func()) {
    n := 0
    return func() {
        n++
        fmt.Println(n)
    }
}

func main() {
    f1, f2 := New(), New()
    f1() // 1
    f2() // 1 (другая n)
    f1() // 2
    f2() // 2
}


Читайте также:


Комментариев нет:

Отправить комментарий