Найти в Дзене
Я, Golang-инженер

#43. Анонимные функции в Go: как и для чего использовать

Это статья об основах программирования на Go. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением. Хой, джедаи и амазонки! Цель этого поста - закрепить информацию об анонимных функциях и лучше разобраться, для чего они нужны. 1. Немного теории Прежде чем переходить к анонимным, будет здорово вспомнить что такое функция сама по себе: Функция в программировании - фрагмент кода, к которому можно обратиться из другого места программы для выполнения определённого действия. После выполнения функции, управление (выполнение кода) переходит обратно в адрес возврата - точку программы после места, где данная функция была вызвана. Примерно так: Анонимная функция в программировании - функция без уникального идентификатора для доступа к ней. Обращение к анонимной функции можно выполнить двумя способами (мне известны два): 2. Практика 2.1. Анонимная функция в теле main() Задача: выполнить арифметические операции над числами, которым задан разный тип данны
Оглавление

Это статья об основах программирования на 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, воспользуйся моей реферальной ссылкой. Ты получишь огромную скидку на курс и плюс в карму за помощь каналу.

Petter Lagson lagopett https://unsplash.com/photos/8yy05SPf3rQ
Petter Lagson lagopett https://unsplash.com/photos/8yy05SPf3rQ

Бро, ты уже здесь? 👉 Подпишись на канал для новичков «Войти в IT» в Telegram, будем изучать IT вместе 👨‍💻👩‍💻👨‍💻