Основы Go
2026-02-26 18:21 Diff

Функции в Go объявляются с помощью ключевого слова func. Пример простой функции умножения:

Сигнатура функции состоит из следующих элементов:

  • func — ключевое слово для объявления функции;

  • multiply — имя функции;

  • (x int, y int) — параметры с указанием типов. Если несколько параметров подряд имеют одинаковый тип, запись можно сократить:

  • int — возвращаемый тип;

  • { ... } — тело функции.

В Go обязательно указывать тип каждого параметра и результат, язык не допускает неявных объявлений. Порядок тоже строгий — тип всегда идёт после имени параметра.

Нет параметров по умолчанию

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

В языках где нет параметров по умолчанию, часто, применяют подход с созданием функции-обертки, которая позволяет эмулировать это поведение. Допустим, у нас есть функция getGreeting(name, greeting string), которая формирует приветствие:

В Go нельзя сделать greeting необязательным, но мы можем создать обёртку:

Вызов внешних функций

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

Если функция определена в другом пакете, её нужно вызывать с указанием имени пакета:

Здесь Println — функция из пакета fmt. Мы обращаемся к ней как fmt.Println, потому что она объявлена в другом пакете.

Встроенные и внешние пакеты

В Go есть встроенные пакеты — они входят в стандартную библиотеку. Например:

  • fmt — для форматированного вывода
  • strings — для работы со строками
  • math — для базовой математики
  • time — для работы со временем

Эти пакеты можно подключать через import без установки дополнительных зависимостей. Кроме встроенных, можно использовать внешние пакеты — они подключаются отдельно через систему модулей (go mod). Работа с внешними пакетами рассматривается в соответствующем курсе на Хекслете.

Именование и доступность

Именование функций в Go следует стилю camelCase. Это означает, что имена пишутся слитно, а каждое новое слово в имени начинается с заглавной буквы: printMessage, processData, sendEmail.

С первой буквой в названиях все чуть сложнее. Ее регистр определяет доступность функции снаружи пакета. Если имя начинается с заглавной буквы, функция доступна из других пакетов (экспортируемая). Если с маленькой, она остаётся внутри текущего пакета.

Так устроена видимость по аналогии с модификаторами доступа в других языках, но без ключевых слов вроде public или private — всё управляется регистром первой буквы.

Множественные возвращаемые значения

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

Здесь функция возвращает два значения: результат деления и объект ошибки (или nil, если ошибки нет). Сигнатура функции теперь содержит несколько типов в круглых скобках после func divide(...) — в данном случае это (int, error).

Такой подход заменяет исключения (try/catch) и делает обработку ошибок явной. Go заставляет вызывающую сторону явно проверять возвращаемую ошибку, что снижает вероятность игнорирования важных условий.