Функции

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

Объявление функции в Go выглядит следующим образом:

func имя_функции (список_параметров) (типы_возвращаемых_значений) {
    тело_функции
}

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

func main() {
    fmt.Println("Hello there")
}

func Grievous() {
    fmt.Println("General Kenobi...")
}

Функцию можно вызывать. В примере выше мы создали функцию Grievous(), которая выводит сообщение в консоль General Kenobi... при вызове. Для того чтобы вызвать созданную функцию нужно обозначить ее в main() функции:

package main
import "fmt"

func main() {
    fmt.Println("Hello there")  // Hello there
    Grievous()                  // General Kenobi...
}

func Grievous() {
    fmt.Println("General Kenobi...")
}

Это пример самых простых функции в Go. И не забываем, что каждая программа на языке Go должна содержать как минимум одну функцию - main(), т.к. она является входной точной для других функций.

Параметры функции

Однако, в практике простые функции без параметров мало кто использует. Параметры являются входными данными для функции. Они указываются в скобкаъ после имени самой функции. Для каждого параметра указывается его имя и тип. Если параметров несколько, то они разделятся друг от друга запятыми. При каждом вызове таких функций мы должны передавать значения для всех обозначенных параметров. Создадим функцию, которая суммирует два числа:

package main
import "fmt"


func sumOf2(a int, b int) {
    fmt.Println(a + b)
}

func main() {
    sumOf2(5, 10)   // 15
    sumOf2(2, 3)    // 5
}

Функция sumOf2 имеет два параметра - a и b. Оба параметра представляют тип int. В самом теле функции мы складываем a и b. После вызова этой функции на консоль выводится сумма этих чисел.

Кстати, если несколько параметров имеют одинаковый тип данных, то его можно указать один, но после последнего параметра этого типа:

func sumOf2(a, b int) {
    fmt.Println(a + b)
}

Неопределенное количество параметров

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

package main
import "fmt"

func infinSum(numbers ...int) {
    sum := 0

    for _, numb := range numbers {
        sum += numb
    }
    fmt.Println(sum)
}

func main() {
    infinSum(5, 10) // 15
    infinSum(5, 10, 15, 20) // 50
    infinSum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) // 55
}

Для определения параметра, который представляет неопределенное количество значений ставится многоточие - numbers ...int. Т.е. через подобный параметр мы получаем несколько значений типа int.

Возвращение результата из функции

Функции могут возвращать результат. Для этого нужно после списка параметров функции указать тип возвращаемого результата. А в теле функции в этом случае необходимо использовать оператор return, после которого указывается возвращаемое значение:

package main
import "fmt"


func sumOf2(a, b int) int {
    return a + b
}

func main() {
    fmt.Println(sumOf2(4, 4))   // 8
}

Возвращаемый результат может быть именован:

package main
import "fmt"


func sumOf2(a, b int) (z int) {
    z = a + b
    return z
}

func main() {
    fmt.Println(sumOf2(7, 4))   // 11
}

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

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

В язык Go существует возможность возвращать несколько значений. В данном случае после списка параметров указывается в скобках список типов возвращаемого значения. После оператора return мы также перечеслем именно те типы возвращаемых значений (через запятую), которые мы указали в скобках после списка параметров:

package main
import "fmt"


func userInfo(age int, fitstName, lastName string) (int, string) {
    fullName := fitstName + " " + lastName
    return age, fullName
}

func main() {
    fmt.Println(userInfo(40, "Homer", "Simpson"))   // 40 Homer Simpson
}

Функция userInfo принимает 3 параметра: число и две строки. Возвращает число и строку. Возвращаемые значения указаны после оператора return.