Go: Функции
Теория: Функции как аргумент
Когда мы говорим «функция как аргумент», имеется в виду, что функция может быть передана внутрь другой функции так же, как мы обычно передаём число, строку или структуру. В Go это возможно потому, что функция — это значение, полноценный объект. У неё есть тип, и этот тип можно указать в параметрах.
Почему это важно? Представьте: у нас есть алгоритм, который одинаков для многих задач. Но внутри есть кусок логики, который зависит от ситуации. Если делать копию функции для каждого случая — будет куча дублирования. А если вынести различающуюся часть наружу и передавать её как функцию, код станет компактным и гибким.
Пример
Здесь greet сама не знает, как именно выводить сообщение. Она лишь формирует строку и передаёт её в функцию printer, которую мы задаём как аргумент. Хотим печатать просто — передаём fmt.Println. Хотим добавить звёздочки — пишем анонимную функцию.
Пример: калькулятор
Функция calculate универсальна: она не знает, что такое «сложение» или «умножение». Она просто принимает два числа и вызывает переданную операцию. Это и есть сила функций как аргументов: мы описываем общий каркас, а детали подставляем на ходу.
Пример: фильтрация
Фильтрация — классика. Есть список значений, и нужно оставить только те, которые удовлетворяют условию.
Здесь filter один для всех случаев. Вынесли переменную часть — «условие» — в функцию check. Теперь её можно подставлять разную: хоть проверку на чётность, хоть проверку на диапазон, хоть на простое число.
Объяснение на пальцах
Можно думать так: когда мы пишем функцию с функцией-аргументом, мы словно оставляем пустое место — «дырку» — и говорим: «Заполню её позже нужной логикой».
Например:
- В
calculateпустое место — это операция. - В
filterпустое место — это условие. - В
greetпустое место — это способ вывести сообщение.
Ещё пример: обработчики событий
Это часто встречается в веб-серверах и GUI.
Функция onEvent не знает, что такое «клик» или «наведение». Ей всё равно. Она просто вызывает переданный обработчик. Это позволяет строить гибкие системы, где логика задаётся снаружи.
Функции как аргументы нужны, чтобы отделять общий алгоритм от частных деталей. Это убирает дублирование, делает код более выразительным и расширяемым. Алгоритм описывается один раз, а поведение можно менять, подставляя разные функции.


