Замыкания функций в языке Go (анонимные функции)

Функции в Go

Язык Go поддерживает анонимные функции, которые можно использовать как замыкания. Анонимная функция — это "inline"-инструкция или выражение. Преимущество анонимных функций в том, что они могут напрямую использовать переменные внутри функции без необходимости объявлять их.

Анонимная функция — это функция без имени функции, обычно используемая для определения функций внутри других функций или для передачи в качестве параметров функции.

В следующем примере мы создаём функцию getSequence(), которая возвращает другую функцию. Цель этой функции — увеличивать переменную i внутри замыкания, как показано в коде ниже:

Пример

package main

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

В следующих примерах мы определяем несколько анонимных функций и демонстрируем, как присваивать анонимные функции переменным, использовать анонимные функции внутри других функций и передавать анонимные функции в качестве аргументов другим функциям.

Пример

package main

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 очень гибкое и может помочь упростить структуру кода и улучшить читаемость кода.

Функции в Go

Другие расширения