В КУРСЕ?

Разбираемся в теме

Функции в Go: параметры, результаты, области видимости и замыкания

Функция в Go — основной способ выделить завершённую часть логики и дать ей понятный интерфейс. Хорошая функция принимает ровно те данные, которые ей нужны, выполняет одну ясную задачу и возвращает результат в предсказуемой форме. Язык поддерживает несколько возвращаемых значений, функции как значения и замыкания, поэтому функции используются не только для сокращения повторяющегося кода, но и для построения гибкой архитектуры.

Сигнатура задаёт контракт

В сигнатуре функции указаны параметры и типы возвращаемых значений. Это контракт между вызывающим кодом и реализацией. Чем понятнее имена и типы, тем меньше скрытых предположений. Если функция требует пять логических флагов, её интерфейс, вероятно, трудно читать. Иногда лучше разделить поведение на несколько функций или передать структуру параметров с понятными полями.

Несколько возвращаемых значений

В Go распространён шаблон, когда функция возвращает основной результат и ошибку. Это делает обработку нештатной ситуации явной: вызывающий код видит, что операция может завершиться неуспешно. Несколько результатов полезны и в других случаях, но не стоит использовать их как замену структуре, если возвращаемые данные образуют единое понятие.

Функции как значения

Функцию можно передать другой функции, сохранить в переменной или вернуть как результат. На этом строятся обработчики, фильтры, стратегии и обратные вызовы. Такой подход позволяет отделить общую механику от изменяемого поведения. Например, одна функция проходит по набору элементов, а другая определяет, какие из них подходят по условию.

Замыкания и область видимости

Замыкание — функция, которая использует переменные из внешней области видимости. Это удобно для небольшого состояния, например счётчика или заранее настроенного обработчика. Но скрытое состояние может усложнить код, если замыкание живёт долго и изменяет много внешних переменных. Чем важнее состояние, тем чаще выгоднее сделать его явной структурой.

Попробуйте на практике

Написать набор функций для обработки списка целых чисел.

  1. Создайте функцию, которая принимает число и возвращает его квадрат.
  2. Создайте функцию, принимающую срез и функцию-преобразование, затем применяющую её к каждому элементу.
  3. Добавьте функцию-фильтр, принимающую условие в виде функции.
  4. Соберите пример: оставить только чётные числа и возвести их в квадрат.

Как проверить результат. Результат верен, если логика преобразования и фильтрации меняется передачей функций, а общий код обхода среза не дублируется.

Частые вопросы

Нужно ли давать имя каждому возвращаемому значению?

Нет. Именованные результаты полезны в некоторых случаях, но могут снижать ясность в длинных функциях, если использовать их без необходимости.

Функции в Go могут быть анонимными?

Да. Анонимные функции удобно использовать как короткие обработчики и для создания замыканий.

Когда функцию стоит разбить на несколько?

Если она делает несколько независимых задач, имеет слишком много ветвей или её сложно назвать одним точным глаголом, разделение часто улучшает читаемость.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов