⚙️ Функция init() в Go
init() - это специальная функция в Go, которая запускается
автоматически до выполнения main(). Она используется для подготовки
программы к работе: настройки, проверок, инициализации ресурсов и любых
действий, которые должны произойти перед стартом основной логики.
🧩 Зачем нужна init()?
Функция init() позволяет выполнить код один раз перед startом
программы, например:
- установить соединения (БД, сеть),
- проверить конфигурацию,
- загрузить или скомпилировать данные,
- инициализировать глобальные переменные,
- подготовить кэш или тяжелые структуры.
Go вызывает init() автоматически, без прямого вызова в коде.
🛠 Правила работы init()
init()вызывается до main()- В каждом файле пакета может быть своя
init() - Все
init()внутри одного пакета выполняются, прежде чем пакет станет доступен - Порядок выполнения: init() пакетов → init() текущего пакета → main()
🧪 Пример: предварительная компиляция регулярного выражения
var EmailExpr *regexp.Regexp
func init() {
compiled, err := regexp.Compile(`.+@.+\..+`)
if err != nil {
panic("failed to compile regular expression")
}
EmailExpr = compiled
fmt.Println("regular expression compiled successfully")
}
Здесь init():
- компилирует регулярку только один раз,
- проверяет, нет ли ошибки,
- сохраняет результат для дальнейшего использования,
- выводит сообщение о готовности.
🔎 Использование подготовленного ресурса
После инициализации можно безопасно использовать данные, подготовленные
в init():
func isValidEmail(addr string) bool {
return EmailExpr.Match([]byte(addr))
}
func main() {
fmt.Println(isValidEmail("invalid"))
fmt.Println(isValidEmail("valid@example.com"))
fmt.Println(isValidEmail("invalid@example"))
}
🧠 Почему init() полезна?
- Позволяет держать инициализацию рядом с кодом, которому она принадлежит.
- Гарантирует, что ресурс доступен до использования.
- Упрощает структуру main(), убирая из него подготовительную логику.
- Помогает избежать повторной инициализации больших структур.
📘 Итоги
init()вызывается автоматически доmain().- У каждого файла пакета может быть своя
init(). - Подходит для инициализации глобальных переменных, проверки окружения и подготовки структуры программы.
- Не возвращает значения и не принимает аргументов.
- Удобна для подготовки сложных или дорогих ресурсов перед началом работы программы.