Назад к урокам

Функция init() в Go

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

Начинающий7 min

⚙️ Функция 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().
  • Подходит для инициализации глобальных переменных, проверки окружения и подготовки структуры программы.
  • Не возвращает значения и не принимает аргументов.
  • Удобна для подготовки сложных или дорогих ресурсов перед началом работы программы.