🟡 Средний · 2 очк. Пакеты и модули
В каком порядке выполняются функции init() в Go-программе?
A Случайный порядок
B Сначала init() всех импортированных пакетов (по графу зависимостей), затем текущий пакет; внутри пакета - по алфавиту имен файлов
C Только один init() на программу
D В порядке объявления в go.mod
Объяснение вопроса

Порядок выполнения init() строго определен:

  1. Граф импортов: сначала выполняются init() всех зависимостей (рекурсивно). Пакет инициализируется только после всех своих импортов.
  2. Внутри пакета: файлы обрабатываются в алфавитном порядке имен файлов.
  3. Внутри файла: сначала инициализация переменных уровня пакета, затем init() в порядке объявления.
// a.go
var x = compute() // 1. переменные пакета
func init() { }   // 2. первый init a.go

// b.go
func init() { }   // 3. init b.go (b.go после a.go по алфавиту)

Каждый пакет инициализируется ровно один раз, даже если импортируется из нескольких мест. Порядок файлов (алфавитный) - деталь реализации gc-компилятора, но на нее опираться не рекомендуется.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.