Go: Функции
Теория: Функции высшего порядка
Когда мы только начинаем писать код, функции кажутся чем-то простым: есть входные данные, есть результат. Но чем больше задач мы решаем, тем чаще повторяется одна и та же схема — меняется только маленькая деталь. Чтобы не копировать код, в Go можно использовать функции высшего порядка.
Функция высшего порядка — это функция, которая принимает другую функцию как аргумент или возвращает функцию как результат. В Go это возможно, потому что функции — это значения, такие же, как строки или числа. Их можно сохранять в переменные, передавать и возвращать.
Функции как аргументы
Допустим, у нас есть срез чисел, и мы хотим применить преобразование к каждому элементу. Вместо того чтобы писать много похожих функций, можно вынести общий алгоритм.
Функция applyToEach — это функция высшего порядка. Она не знает, что именно нужно сделать с числом, и делегирует это другой функции.
Анонимные функции в аргументах
Иногда создавать отдельную функцию ради одной строчки — слишком громоздко. Тогда можно передать анонимную функцию прямо в вызове.
Функции в стандартной библиотеке
В Go часто встречается приём передачи функций в стандартных пакетах. Например, в sort.Slice мы задаём правила сортировки через функцию сравнения:
Здесь видно, что функции высшего порядка — это не теория, а повседневный инструмент.
Функции как результат
Функция может возвращать не только значения, но и другие функции. Такой приём называется замыканием.
makeMultiplier создаёт функцию, которая “помнит” коэффициент factor.
Функции-обёртки (декораторы)
Функции высшего порядка можно использовать для оборачивания логики — например, добавить логирование:
Именованные типы для функций
Чтобы код выглядел аккуратнее, можно объявлять собственный тип для функций:
Это особенно удобно, если функция принимает сразу несколько функций как аргументы.
Ошибки и функции высшего порядка
Иногда функции возвращают ошибки. В таком случае обёртка тоже должна их обрабатывать:
Параллель с map, filter и reduce
В Go нет встроенных функций map, filter и reduce, как в функциональных языках, но мы можем написать их сами:
Итоги
Функции высшего порядка в Go позволяют писать код чище и понятнее. Они помогают вынести общий алгоритм в одну функцию и подставлять разные детали в виде других функций. При этом не обязательно создавать отдельные именованные функции — нужную логику можно написать прямо на месте с помощью анонимных. Такой приём даёт возможность реализовать преобразование коллекций наподобие map, filter и reduce.
Функции можно использовать и для обёрток: например, добавить к существующей операции логирование или обработку ошибок. Чтобы код оставался читаемым, удобно объявлять собственные типы для функций и работать с ними так же, как с любыми другими данными.
В Go функция — это значение. Её можно хранить в переменной, передавать в другую функцию и возвращать как результат. Это делает язык гибким и позволяет строить простые, но мощные конструкции.


