Это статья об основах программирования на Go. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением.
Хой, джедаи и амазонки!
Цель этого поста - закрепить информацию об анонимных функциях и лучше разобраться, для чего они нужны.
1. Немного теории
Прежде чем переходить к анонимным, будет здорово вспомнить что такое функция сама по себе:
Функция в программировании - фрагмент кода, к которому можно обратиться из другого места программы для выполнения определённого действия.
После выполнения функции, управление (выполнение кода) переходит обратно в адрес возврата - точку программы после места, где данная функция была вызвана. Примерно так:
Анонимная функция в программировании - функция без уникального идентификатора для доступа к ней. Обращение к анонимной функции можно выполнить двумя способами (мне известны два):
- Вызываются напрямую при создании;
- Ссылка на анонимную функцию присваивается переменной, с помощью которой далее можно вызывать эту функцию. Хотя в этом случае функция уже получает имя и теряет свои выгоды (см. ниже) в части анонимности.
2. Практика
2.1. Анонимная функция в теле main()
Задача: выполнить арифметические операции над числами, которым задан разный тип данных. Пример реализации ниже и на github:
Здесь пример присвоения переменной (f) ссылки на анонимную функцию.
В чём выгода подхода создавать анонимную функцию? А, например, не создания отдельной функции или просто присвоения переменной арифметических действий.
Первое возражение: почему не создали обычную функцию, а применили анонимную?
Ответ на первое возражение: в этом случае нам придётся придумывать имя этой функции. А мы помним, что исходя из чистого кода - для поддерживаемости кода, необходимо придумывать "говорящие" имена. Хоть переменным, хоть функциям. Какое можно придумать говорящее имя для этого арифметического выражения?
Варианты (для наглядности показываю их на русском и английском):
- операция/operation;
- выражение/expression;
- многочлен/polynomial и т.д.
Не особо говорящие имена. Вот, чтобы сохранять чистоту и поддерживаемость кода, для подобных функций, которые делают простую работу, но для которой трудно подобрать определение - полезно делать их анонимными.
Ещё когда (если) будем писать документацию, понадобится отдельно документировать вынесенную отдельно функцию:
Зачем это нужно, если можно обойтись анонимной функцией. Честно-говоря, я не документировал код и даже не представляю, как выглядит документация кода. Поделитесь, если у вас есть такие примеры. Но коллеги говорили, что такая задача у бизнеса есть.
Второй возражение: почему бы не присвоить переменной арифметические действия? Например, такое:
f := 2*float32(x) + float32(y*y) - 3/z
Ответ на второе возражение: нам может понадобится использовать это простое выражение несколько раз с различными значениями (в даном примере - с различными выражениями x, y, z). Будет плохой идеей каждый раз прописывать новые значения для переменной.
Требование чистого кода: избегать повторений блоков кода.
Проще для конкретных расчётов использовать анонимную функцию. Но тут придётся придумать имя переменной, в которой будем хранить ссылку на эту функцию. Т.е., формально, функция перестаёт быть анонимной. Это тоже важно понимать.
Короче, простое повторяющееся действие лучше обернуть в анонимную функцию.
2.2. Анонимная функция вне main()
Допустим, мы хотим передать анонимную функцию в другую функцию. Что делать? Честно говоря, я не разобрался как это сделать с переменной, которой присвоили ссылку на анонимную функцию. Будем передавать анонимную функцию напрямую.
Задача: передать в функцию анонимную функцию, которая делает нехитрые действия.
Что мы видим в программе? В функции мэйн мы вызываем функцию wrapFunc. При этом в ней мы обернули в анонимную функцию простое выражение l + m.
Далее уже в функции wrapFunc мы печатаем результат выполнения работы анонимной функции. Вот весь функционал функции wrapFunc - напечатать результат работы анонимной функции.
Это просто пример, на который можно ориентироваться - как передавать анонимную функцию в другую функцию. Которая может делать какие-то действия с анонимной.
Может это будет не печать в терминал, а сохранение в файл - я не знаю - может ещё что-то. Просто на данном этапе важно знать, что такой функционал есть, и уметь им пользоваться.
3. Выводы
Когда у нас есть простые (арифметические) повторяющиеся действия, для которых трудно подобрать имя - используем анонимную функцию вместо того, чтобы:
- Выполнять вычисления в переменной;
- Создавать отдельную мизерную функцию с идентификатором (обычную функцию).
Собственно, короткая публикация, короткий вывод. Для меня важно закрепить синтаксис анонимной функции. Что-то мне подсказывает, что обращаться в период обучения к ней, буду нечасто. А возвращаться к видеоурокам, чтобы вспомнить синтаксис - непродуктивно тратить время.
Успехов, бро! Я желаю тебе творческих успехов и вдохновения. Верь в свой ум и свои силы. И у тебя всё получится как в профессиональном, так, и могу тебе сказать, в личном плане.
--//--//--
PS Если захочешь купить курс от SkillBox, воспользуйся моей реферальной ссылкой. Ты получишь огромную скидку на курс и плюс в карму за помощь каналу.
Бро, ты уже здесь? 👉 Подпишись на канал для новичков «Войти в IT» в Telegram, будем изучать IT вместе 👨💻👩💻👨💻