cpp

Замыкание

Анонимные функции захватывают переменные в родительской области видимости (это называется замыканием). Если анонимная функция объявлена внутри функции, то после выхода из функции область видимости сохраняется и мы можем получить доступ к переменным, существовавшим в момент создания анонимной функции (листинг 10.15).

Листинг 10.15. Замыкание

package main

import "fmt"

func main() {
   f1 := test(5) // Вызов внешней функции
   f1(10)        // Вызов вложенной функции
   // x = 5 y = 10
   f1(55)        // Вызов вложенной функции
   // x = 5 y = 55
   f2 := test(2)
   f2(14)        // Вызов вложенной функции
   // x = 2 y = 14
   f2(88)        // Вызов вложенной функции
   // x = 2 y = 88
   test(3)(6)    // Вызов внешней и вложенной функций
   // x = 3 y = 6
}
func test(x int) func(int) {
   return func(y int) {
      fmt.Println("x =", x, "y =", y)
   }
}

При использовании анонимных функций следует учитывать, что при указании внутри функции локальной переменной будет сохранена ссылка на эту переменную, а не на ее значение:

x := 5
f := func() int {
   return x      // Сохраняется ссылка, а не значение переменной x !
}
fmt.Println(f()) // 5
x = 10           // Изменили значение
fmt.Println(f()) // 10, а не 5

Чтобы получить копию значения переменной на момент создания можно воспользоваться, например, следующим кодом:

x := 5
f := func(n int) func() int {
   return func() int {
      return n
   }
}(x)
fmt.Println(f()) // 5
x = 10           // Изменили значение
fmt.Println(f()) // 5

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp