Замыкания функций в языке Go (анонимные функции)
Язык Go поддерживает анонимные функции, которые можно использовать как замыкания. Анонимная функция — это "inline"-инструкция или выражение. Преимущество анонимных функций в том, что они могут напрямую использовать переменные внутри функции без необходимости объявлять их.
Анонимная функция — это функция без имени функции, обычно используемая для определения функций внутри других функций или для передачи в качестве параметров функции.
В следующем примере мы создаём функцию getSequence(), которая возвращает другую функцию. Цель этой функции — увеличивать переменную i внутри замыкания, как показано в коде ниже:
Пример
import "fmt"
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
func main(){
/* nextNumber — это функция, в которой i инициализируется значением 0 */
nextNumber := getSequence()
/* Вызовите функцию nextNumber: переменная i увеличивается на 1 и возвращается */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* Создайте новую функцию nextNumber1 и проверьте результат */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}
Результат выполнения приведённого выше кода:
1 2 3 1 2
В следующих примерах мы определяем несколько анонимных функций и демонстрируем, как присваивать анонимные функции переменным, использовать анонимные функции внутри других функций и передавать анонимные функции в качестве аргументов другим функциям.
Пример
import "fmt"
func main() {
// Определите анонимную функцию и присвойте её переменной add
add := func(a, b int) int {
return a + b
}
// Вызовите анонимную функцию
result := add(3, 5)
fmt.Println("3 + 5 =", result)
// Использование анонимной функции внутри функции
multiply := func(x, y int) int {
return x * y
}
product := multiply(4, 6)
fmt.Println("4 * 6 =", product)
// Передача анонимной функции в качестве аргумента другим функциям
calculate := func(operation func(int, int) int, x, y int) int {
return operation(x, y)
}
sum := calculate(add, 2, 8)
fmt.Println("2 + 8 =", sum)
// Вы также можете определить анонимную функцию прямо в вызове функции
difference := calculate(func(a, b int) int {
return a - b
}, 10, 4)
fmt.Println("10 - 4 =", difference)
}
Результат выполнения приведённого выше кода:
3 + 5 = 8 4 * 6 = 24 2 + 8 = 10 10 - 4 = 6
Использование анонимных функций в Go очень гибкое и может помочь упростить структуру кода и улучшить читаемость кода.
Другие расширения