Skip to content

Функция init

Может быть несколько функций с именем init, объявленных в одном пакете. Функции с именем init не должны иметь никаких входных параметров и возвращать результаты.

Обрати внимание, что в верхнем блоке уровня пакета init идентификатор может использоваться только в объявлениях функций. Мы не можем объявлять переменные/константы/типы на уровне пакета, имена которых init.

Во время выполнения каждая init функция будет (последовательно) вызываться один и только один раз (перед вызовом main функции входа). Таким образом, значение init функций очень похоже на блоки статического инициализатора в Java.

Вот простой пример, который содержит две init функции:

Вывод этой программы:

Порядок инициализации ресурсов

Во время выполнения пакет будет загружен после всех его пакетов зависимостей. Каждый пакет будет загружен только один раз.

Все init функции во всех задействованных пакетах в программе будут вызываться последовательно. Функция init в импортирующем пакете будет вызываться после всех init функций, объявленных в пакетах зависимостей импортирующего пакета. Все init функции будут вызываться перед вызовом main функции входа.

Порядок вызова init функций в одном и том же исходном файле — сверху вниз. Спецификация Go рекомендует, но не требует, вызывать init функции в разных исходных файлах одного и того же пакета в алфавитном порядке имен файлов, содержащих их исходные файлы. Поэтому не рекомендуется иметь отношения зависимости между двумя init функциями в двух разных исходных файлах.

Все переменные уровня пакета, объявленные в пакете, инициализируются перед вызовом любой init функции, объявленной в том же пакете.

Среда выполнения Go попытается инициализировать переменные уровня пакета в пакете в соответствии с порядком их объявления, но переменная уровня пакета наверняка будет инициализирована после всех ее зависимых переменных. Например, в следующем фрагменте кода инициализация четырех переменных уровня пакета происходит в порядке y, z, x и w.

Подробнее о правиле порядка инициализации переменных уровня пакета читай в статье.