HTML Diff
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>