Функции и методы

init() и main()

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

Пакеты на языке Go могут иметь функции init() - они все выполнятся перед main(). Причем, функции init, как и main, можно не вызывать специально.

Функции

func имяФункции (необязательныеПараметры) типНеобязательногоВозвращаемогоЗначения {
    тело
}
func имяФункции (необязательныеПараметры) (необязательныеоВозвращаемыеЗначения) {
    тело
}

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

может быть функция с неопределенным количеством параметров

func test(a int, b ...int) {
    Здесь будет b []int
}

Именованные возвращаемыее значения

Возвращаемые значения могут быть именованные и неименованные. Смешивать нельзя. Именованные возвращаемые значения рекомендуется использовать только в коротких функциях (чтобы не ухудшать читаемость кода).

Пример:

На текущий момент компиляторы не способны распознать return в секции default или else безусловном. Принято в таких случаях использовать panic("unreachable")

Передача параметров из одной функции в другую

Необязательные параметры

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

Выбор функции во время выполнения

Ветвление с помощью отображений и ссылок на функции

Методы

Примеры

Пример метода, переопределяющего функцию len для типа Stack. Имя stack (может быть любым) в терминах Go называется приемником (в других языках это имя фиксировано - this, self,..).

Если метод должен изменять значение приемника, его необходимо определить как указатель. В противном случае, в метод передается копия объекта.

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

Ограничения

Имена всех методов должны быть уникальны в пределах одного типа. Следовательно, нельзя создать два одинаковых метода - один для значения, другой для указателя.

Отсутствует поддержка перегруженных методов. Один способов реализовать подобие перегруженных методов - использовать методы с переменным числом аргументов, однако в Go принято использовать функции с уникальными именами. Например тип strings.Reader представляет три разных метода чтения: strings.Reader.Read(), strings.Reader.ReadByte(), strings.Reader.ReadRune().

Множество методов значения - все методы этого типа, принимающие приемник по значению. Множество методов указателя - все методов этого типа, принимающий приемник по значению и по указателю!

Переопределение методов

Конструкторы

Конструкторы - это функции, возвращающие проинициализированне значение. Их принято называть New...

Анонимная функция (замыкания)

Пример:

Для чего используются

Создание функций-оберток

Создание фабричных функций

фабричные функции - такие функции, которые возвращают другие функции

Last updated