Использование анонимных функций в качестве функций обратного вызова (callback functions)
Анонимные функции также могут использоваться в качестве функций обратного вызова (callback), что означает, что мы можем передавать их в качестве аргументов другим функциям. Это полезно, когда вы хотите настроить поведение функции без создания именованной функции.
Что такое функции обратного вызова?
Функция обратного вызова - это функция, которая передается в качестве аргумента другой функции и выполняется после того, как первая функция завершает свою задачу. Это позволяет вызывающей стороне настроить поведение вызываемой функции, обеспечивая больше гибкости и модульности. По сути, функция, получающая функцию обратного вызова, вызовет эту функцию "назад" в какой-то момент.
Почему использовать анонимные функции в качестве функций обратного вызова?
Анонимные функции отлично подходят в качестве функций обратного вызова, потому что они часто представляют собой короткие, специфические действия, которые используются только в определенном контексте. Использование анонимной функции в качестве функции обратного вызова делает код более компактным и позволяет избежать определения отдельной именованной функции.
Замените содержимое файла anonymous.go
следующим кодом:
package main
import (
"fmt"
"math"
)
// 'visit' takes a slice and a function. It applies the function to each element in the slice.
func visit(lst []float64, f func(float64)) {
for _, value := range lst {
f(value)
}
}
func main() {
arr := []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}
// Use an anonymous function to sum each element with itself
visit(arr, func(v float64) {
fmt.Printf("Sum:%.0f ", v+v)
})
fmt.Println()
// Use an anonymous function to multiply each element by itself
visit(arr, func(v float64) {
fmt.Printf("Product:%.0f ", v*v)
})
fmt.Println()
// Use an anonymous function to square each element using math.Pow
visit(arr, func(v float64) {
v = math.Pow(v, 2)
fmt.Printf("Square:%.0f ", v)
})
fmt.Println()
}
Запустите программу:
go run anonymous.go
Ожидаемый вывод:
Sum:2 Sum:4 Sum:6 Sum:8 Sum:10 Sum:12 Sum:14 Sum:16 Sum:18
Product:1 Product:4 Product:9 Product:16 Product:25 Product:36 Product:49 Product:64 Product:81
Square:1 Square:4 Square:9 Square:16 Square:25 Square:36 Square:49 Square:64 Square:81
В этой программе мы сначала создаем функцию visit
, которая принимает срез (lst
) типа float64
и функцию (f
) типа func(float64)
. Функция visit
проходит по срезу и вызывает предоставленную функцию f
для каждого элемента. Этот шаблон проектирования позволяет функции visit
выполнять различную логику в зависимости от предоставленной функции обратного вызова f
.
Внутри функции main
мы вызываем функцию visit
три раза с разными анонимными функциями, чтобы продемонстрировать, как функции обратного вызова обеспечивают гибкость.
- Первая анонимная функция вычисляет сумму каждого элемента с самим собой.
- Вторая анонимная функция вычисляет произведение каждого элемента на самого себя.
- Третья анонимная функция возводит каждый элемент в квадрат с использованием функции
math.Pow
.
Это показывает, как анонимную функцию можно передать в качестве функции обратного вызова и как функция visit
может выполнять разные действия на основе функции обратного вызова, переданной в качестве параметра. Это делает ваш код более переиспользуемым и модульным.