Введение
По мере увеличения сложности проектов обычно код разбивается на несколько функций. Такой подход улучшает читаемость кода, облегчает совместную работу и позволяет быстро повторно использовать логику без дублирования кода. В этом практическом занятии (lab) вы узнаете основы создания и использования функций в Go. Вы увидите, как определять свои собственные функции, поймете, как Go обрабатывает параметры и возвращаемые значения, и узнаете о функциях init и переменных параметрах.
Основные темы:
- Понимание, что такое функции и как они работают
- Объявление функций в Go
- Передача параметров по значению и по ссылке
- Возвращение нескольких значений из функции
- Использование функции
initдля настройки среды - Работа с переменными параметрами для гибкой обработки входных данных
Создание и запуск базовой программы
Сначала перейдите в каталог своего проекта и создайте файл на языке Go:
cd ~/project
touch func.go
Откройте файл func.go с помощью текстового редактора и добавьте следующий код:
package main
import "fmt"
func main() {
a1, b1 := 12, 4
a2, b2 := 12, 0
// For the first pair
if b1 == 0 {
fmt.Println("The divisor cannot be 0")
} else {
fmt.Println(a1 / b1)
}
// For the second pair
if b2 == 0 {
fmt.Println("The divisor cannot be 0")
} else {
fmt.Println(a2 / b2)
}
}
Этот код пытается выполнить две операции деления и проверяет, является ли делитель равным нулю, перед выполнением деления. Если делитель равен нулю, выводится сообщение об ошибке.
Запустите программу:
go run func.go
Вы должны увидеть:
3
The divisor cannot be 0
Объявление функции
В предыдущих практических занятиях (labs), вне зависимости от того, был ли программа простой или сложной, мы использовали только функцию main для выполнения операций.
Программа может иметь только одну функцию main, которая является точкой входа в программу. Когда мы запускаем программу, другие функции вызываются и выполняются непосредственно или косвенно внутри функции main.
Теперь давайте посмотрим на синтаксис функций:
func functionName(parameters...)(returnValues...){
code block
}
Здесь имя функции используется для идентификации функции. К именам функций применяются следующие правила:
- Имя может состоять из букв, цифр и подчеркиваний. Однако первая буква имени функции не может быть цифрой. Например,
func 3ab(){}не является допустимым. - Когда первая буква имени функции написана заглавной буквой, функцию можно вызвать из кода в других пакетах. Когда первая буква написана строчной, функция может быть использована только внутри пакета. Это аналогично публичным и приватным функциям.
Список параметров объявляет количество и тип параметров, передаваемых в функцию:
Список параметров может быть пустым или содержать несколько параметров.
Каждый параметр состоит из имени параметра и типа параметра. Например, в следующем списке параметров мы объявляем две переменные типа
int.func test(a, b int) (res int){}
Список возвращаемых значений используется для возврата необходимых значений после выполнения функции:
Список возвращаемых значений похож на список параметров. Количество параметров может быть любым.
Как правило, список возвращаемых значений состоит из имен переменных и типов переменных, причем имя переменной является необязательным.
Если возвращается только одна переменная и объявлен только ее тип, скобки можно опустить. Например:
func test(a int, b string) int{}
Когда типы параметров одинаковы, можно использовать сокращенную запись. Следующие две функции имеют одинаковую функциональность:
func test(a, b int, c, d string)(res1, res2 int, res3 string){}
// Short writing mode
func test(a, b int, c, d string)(res1, res2 int, res3 string){}
Замените содержимое файла func.go следующим кодом:
package main
import "fmt"
func check(divisor int) bool {
if divisor == 0 {
fmt.Println("The divisor cannot be 0")
return false
}
return true
}
func main() {
a1, b1 := 12, 4
a2, b2 := 12, 0
// Use the check function before division
if check(b1) {
fmt.Println(a1 / b1)
}
if check(b2) {
fmt.Println(a2 / b2)
}
}
Запустите программу снова:
go run func.go
Вы должны увидеть такой же вывод:
3
The divisor cannot be 0
На этот раз логика проверки инкапсулирована в функции check, что делает код более чистым и повторно используемым.
Использование функции init
Go поддерживает функцию init, которая запускается перед функцией main. Чаще всего эта функция используется для настройки условий среды или инициализации переменных перед основным выполнением программы.
Замените содержимое файла func.go следующим кодом:
package main
import "fmt"
func init() {
fmt.Println("init statement")
}
func main() {
fmt.Println("main statement")
}
Запустите программу:
go run func.go
Вы должны увидеть следующий вывод:
init statement
main statement
В Go функция init имеет следующие характеристики:
- У нее нет входных параметров и возвращаемых значений.
- Ее нельзя вызвать из других функций.
В одном и том же файле кода или в одном и том же пакете может быть несколько функций init. Порядок их выполнения следующий:
- Функция
init, которая появляется раньше в одном и том же файле кода, будет выполнена раньше. - Файлы, у которых в алфавитном порядке имя идет раньше в рамках одного и того же
package, будут выполнены раньше. Например, если в одном и том жеpackageесть следующие файлы с функциямиinit:
a1.go
a2.go
b1.go
Порядок выполнения будет следующим: a1.go, a2.go, b1.go, так как a < b и 1 < 2.
Возвращение нескольких значений из функции
В Go функции могут возвращать несколько значений. Это полезно для выполнения нескольких связанных вычислений сразу.
Замените содержимое файла func.go следующим кодом:
package main
import "fmt"
func cal(a, b int) (int, int, int, int) {
return a + b, a - b, a * b, a % b
}
func main() {
add, sub, mul, rem := cal(90, 12)
fmt.Println(add, sub, mul, rem)
}
Запустите программу:
go run func.go
Вы должны увидеть следующий вывод:
102 78 1080 6
В данном случае функция cal возвращает сразу четыре значения, что показывает, как использование нескольких возвращаемых значений может упростить выполнение определенных задач.
Работа с переменным числом параметров
Переменное количество параметров позволяет функции принимать переменное число аргументов. Это может упростить сценарии, где размер входных данных не фиксирован.
Замените содержимое файла func.go следующим кодом:
package main
import "fmt"
func printX(values...string) {
for _, v := range values {
fmt.Println(v)
}
}
func main() {
printX("labex", "labs", "courses")
}
Запустите программу:
go run func.go
Вы должны увидеть следующий вывод:
labex
labs
courses
Функция printX может обрабатывать любое количество строковых аргументов, что делает ее гибкой и простой в использовании.
Резюме
В этом практическом занятии (lab) вы научились определять и использовать функции в Go, в том числе возвращать несколько значений и принимать переменное количество параметров. Вы также увидели, как функция init запускается перед функцией main. Организуя код в виде функций, вы можете сделать свои программы более понятными, легкими в поддержке и повторном использовании.
Эти навыки являются фундаментальными для создания модульных и масштабируемых приложений на Go. По мере роста ваших проектов использование функций для организации кода и логики станет все более важным.



