0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Функции в Go объявляются с помощью ключевого слова func. Пример простой функции умножения:</p>
1
<p>Функции в Go объявляются с помощью ключевого слова func. Пример простой функции умножения:</p>
2
<p>Сигнатура функции состоит из следующих элементов:</p>
2
<p>Сигнатура функции состоит из следующих элементов:</p>
3
<ul><li><p>func - ключевое слово для объявления функции;</p>
3
<ul><li><p>func - ключевое слово для объявления функции;</p>
4
</li>
4
</li>
5
<li><p>multiply - имя функции;</p>
5
<li><p>multiply - имя функции;</p>
6
</li>
6
</li>
7
<li><p>(x int, y int) - параметры с указанием типов. Если несколько параметров подряд имеют одинаковый тип, запись можно сократить:</p>
7
<li><p>(x int, y int) - параметры с указанием типов. Если несколько параметров подряд имеют одинаковый тип, запись можно сократить:</p>
8
</li>
8
</li>
9
<li><p>int - возвращаемый тип;</p>
9
<li><p>int - возвращаемый тип;</p>
10
</li>
10
</li>
11
<li><p>{ ... } - тело функции.</p>
11
<li><p>{ ... } - тело функции.</p>
12
</li>
12
</li>
13
</ul><p>В Go обязательно указывать тип каждого параметра и результат, язык не допускает неявных объявлений. Порядок тоже строгий - тип всегда идёт после имени параметра.</p>
13
</ul><p>В Go обязательно указывать тип каждого параметра и результат, язык не допускает неявных объявлений. Порядок тоже строгий - тип всегда идёт после имени параметра.</p>
14
<h2>Нет параметров по умолчанию</h2>
14
<h2>Нет параметров по умолчанию</h2>
15
<p>В Go не поддерживаются параметры по умолчанию, в отличие от многих других языков программирования. То есть, если функция принимает два аргумента, вы обязаны передать оба значения при вызове.</p>
15
<p>В Go не поддерживаются параметры по умолчанию, в отличие от многих других языков программирования. То есть, если функция принимает два аргумента, вы обязаны передать оба значения при вызове.</p>
16
<p>В языках где нет параметров по умолчанию, часто, применяют подход с созданием функции-обертки, которая позволяет эмулировать это поведение. Допустим, у нас есть функция getGreeting(name, greeting string), которая формирует приветствие:</p>
16
<p>В языках где нет параметров по умолчанию, часто, применяют подход с созданием функции-обертки, которая позволяет эмулировать это поведение. Допустим, у нас есть функция getGreeting(name, greeting string), которая формирует приветствие:</p>
17
<p>В Go нельзя сделать greeting необязательным, но мы можем создать обёртку:</p>
17
<p>В Go нельзя сделать greeting необязательным, но мы можем создать обёртку:</p>
18
<h2>Вызов внешних функций</h2>
18
<h2>Вызов внешних функций</h2>
19
<p>Функции, объявленные в одном и том же пакете, можно вызывать просто по имени:</p>
19
<p>Функции, объявленные в одном и том же пакете, можно вызывать просто по имени:</p>
20
<p>Если функция определена в другом пакете, её нужно вызывать с указанием имени пакета:</p>
20
<p>Если функция определена в другом пакете, её нужно вызывать с указанием имени пакета:</p>
21
<p>Здесь Println - функция из пакета fmt. Мы обращаемся к ней как fmt.Println, потому что она объявлена в другом пакете.</p>
21
<p>Здесь Println - функция из пакета fmt. Мы обращаемся к ней как fmt.Println, потому что она объявлена в другом пакете.</p>
22
<h2>Встроенные и внешние пакеты</h2>
22
<h2>Встроенные и внешние пакеты</h2>
23
<p>В Go есть встроенные пакеты - они входят в стандартную библиотеку. Например:</p>
23
<p>В Go есть встроенные пакеты - они входят в стандартную библиотеку. Например:</p>
24
<ul><li>fmt - для форматированного вывода</li>
24
<ul><li>fmt - для форматированного вывода</li>
25
<li>strings - для работы со строками</li>
25
<li>strings - для работы со строками</li>
26
<li>math - для базовой математики</li>
26
<li>math - для базовой математики</li>
27
<li>time - для работы со временем</li>
27
<li>time - для работы со временем</li>
28
</ul><p>Эти пакеты можно подключать через import без установки дополнительных зависимостей. Кроме встроенных, можно использовать внешние пакеты - они подключаются отдельно через систему модулей (go mod). Работа с внешними пакетами рассматривается в соответствующем курсе на Хекслете.</p>
28
</ul><p>Эти пакеты можно подключать через import без установки дополнительных зависимостей. Кроме встроенных, можно использовать внешние пакеты - они подключаются отдельно через систему модулей (go mod). Работа с внешними пакетами рассматривается в соответствующем курсе на Хекслете.</p>
29
<h2>Именование и доступность</h2>
29
<h2>Именование и доступность</h2>
30
<p>Именование функций в Go следует стилю camelCase. Это означает, что имена пишутся слитно, а каждое новое слово в имени начинается с заглавной буквы: printMessage, processData, sendEmail.</p>
30
<p>Именование функций в Go следует стилю camelCase. Это означает, что имена пишутся слитно, а каждое новое слово в имени начинается с заглавной буквы: printMessage, processData, sendEmail.</p>
31
<p>С первой буквой в названиях все чуть сложнее. Ее регистр определяет доступность функции снаружи пакета. Если имя начинается с заглавной буквы, функция доступна из других пакетов (экспортируемая). Если с маленькой, она остаётся внутри текущего пакета.</p>
31
<p>С первой буквой в названиях все чуть сложнее. Ее регистр определяет доступность функции снаружи пакета. Если имя начинается с заглавной буквы, функция доступна из других пакетов (экспортируемая). Если с маленькой, она остаётся внутри текущего пакета.</p>
32
<p>Так устроена видимость по аналогии с модификаторами доступа в других языках, но без ключевых слов вроде public или private - всё управляется регистром первой буквы.</p>
32
<p>Так устроена видимость по аналогии с модификаторами доступа в других языках, но без ключевых слов вроде public или private - всё управляется регистром первой буквы.</p>
33
<h2>Множественные возвращаемые значения</h2>
33
<h2>Множественные возвращаемые значения</h2>
34
<p>Go поддерживает возвращение нескольких значений из функции. Наиболее частый сценарий - возврат результата и ошибки. Работу с ошибками мы рассмотрим чуть позже, здесь же код дается просто для понимания идеи.</p>
34
<p>Go поддерживает возвращение нескольких значений из функции. Наиболее частый сценарий - возврат результата и ошибки. Работу с ошибками мы рассмотрим чуть позже, здесь же код дается просто для понимания идеи.</p>
35
<p>Здесь функция возвращает два значения: результат деления и объект ошибки (или nil, если ошибки нет). Сигнатура функции теперь содержит несколько типов в круглых скобках после func divide(...) - в данном случае это (int, error).</p>
35
<p>Здесь функция возвращает два значения: результат деления и объект ошибки (или nil, если ошибки нет). Сигнатура функции теперь содержит несколько типов в круглых скобках после func divide(...) - в данном случае это (int, error).</p>
36
<p>Такой подход заменяет исключения (try/catch) и делает обработку ошибок явной. Go заставляет вызывающую сторону явно проверять возвращаемую ошибку, что снижает вероятность игнорирования важных условий.</p>
36
<p>Такой подход заменяет исключения (try/catch) и делает обработку ошибок явной. Go заставляет вызывающую сторону явно проверять возвращаемую ошибку, что снижает вероятность игнорирования важных условий.</p>