init() — специальная функция, выполняется автоматически при импорте пакета, до main().
package db
var conn *sql.DB
func init() {
var err error
conn, err = sql.Open("postgres", os.Getenv("DB_URL"))
if err != nil {
log.Fatal(err)
}
}
Порядок:
1. Инициализация переменных пакета
2. init() (может быть несколько в одном файле и пакете)
3. main() вызывается последней
Порядок между пакетами — по зависимостям: если main импортирует db, а db импортирует config, то init: config → db → main.
Не злоупотребляй init():
- Затрудняет тестирование (нельзя контролировать момент вызова)
- Скрывает зависимости
- Лучше явная инициализация:
db.Connect(cfg)