На этом шаге рассмотрим функции init() и main().
В языке Go имеются два имени функций, зарезервированные для специальных целей: init() (во всех пакетах) и main() (только в пакете main). Эти две функции всегда должны быть определены как не принимающие аргументов и ничего не возвращающие. Пакет может иметь любое количество функций init().
Функции init() в пакетах, как и функция main() в пакете main, вызываются автоматически, поэтому их не требуется вызывать явно.
Для программ и пакетов функция init() является необязательной, но всякая программа должна иметь единственную функцию main() в пакете main.
Инициализация и выполнение программ на языке Go всегда начинаются с пакета main. Если в этом пакете имеется раздел импортирования, каждый импортируемый пакет импортируется по очереди. Пакеты импортируются только один раз, даже если более чем один пакет импортирует один и тот же пакет. Например, пакет fmt может импортироваться несколькими пакетами, но после того, как он будет импортирован в первый раз, повторное его импортирование производиться не будет, так как в этом нет необходимости. Если пакет имеет собственный раздел импортирования, при его импортировании сначала будет произведен импорт указанных в нем пакетов. Затем будут созданы константы и переменные уровня пакета. А далее будет вызвана функция init() (если имеется). Когда в пакете main завершится импортирование пакетов (после того как они завершат импортирование своих пакетов и т. д.), в этот момент будут созданы константы и переменные пакета main и вызвана его функция init() (если имеется). И наконец, будет вызвана функция main() из пакета main, и программа начнет выполнение. Эта последовательность событий изображена на рис. 1.
Рис.1. Последовательность запуска программы
В функциях init() допускается использовать инструкции go, но они запустятся до вызова функции main.main() и потому не должны зависеть от чего бы то ни было, что создается в функции main().
На следующем шаге рассмотрим замыкания в Go.