Код до main
Функция с точным именем init запускается автоматически после инициализации переменных пакета и до вызова main. Пакет может объявить несколько таких функций; пакеты-зависимости инициализируются раньше пакетов, которые от них зависят. У функции init нет параметров и результатов, и её нельзя вызвать напрямую.
Это удобно для небольшой гарантированной настройки пакета. Но init не может вернуть ошибку, поэтому подключение к сети, открытие базы данных или чтение обязательного файла там скрывает отказ и усложняет управление ресурсом. Такие действия лучше помещать в обычную функцию и явно вызвать из main, где можно проверить ошибку и завершить запуск понятным образом.
Пример
package main
import (
"fmt"
"strings"
)
var defaultTags []string
func init() {
defaultTags = []string{"новое", "популярное"}
}
func loadCatalog() []string {
return append([]string(nil), defaultTags...)
}
func main() {
tags := loadCatalog()
fmt.Println(strings.Join(tags, ", "))
}
Здесь init задаёт небольшие значения по умолчанию до входа в main, а loadCatalog явно возвращает их вызывающему коду. У этой простой операции нет ожидаемой ошибки. Если вместо копирования значений функция читает файл или подключается к ресурсу, объяви ей результат ([]string, error), верни реальную ошибку чтения и обработай её в main.
При нескольких подключённых пакетах все их init выполняются до main, даже если программа не вызывает экспортированные функции пакета. Поэтому не стоит использовать init как скрытый сценарий запуска приложения.