Проверяет понимание правил инициализации пакетов в Go, включая количество и порядок вызова init-функций.
В языке Go init — это специальная функция без параметров и возвращаемого значения, которая вызывается автоматически при инициализации пакета. Она не может быть вызвана явно из кода. Основное назначение — выполнение подготовительных действий, таких как инициализация глобальных переменных, проверка конфигураций или регистрация компонентов.
В одном пакете может быть любое количество init-функций. Они могут быть объявлены в разных файлах пакета или в одном файле. Go компилятор собирает все init-функции и выполняет их в порядке их появления в исходном коде (сначала в одном файле, затем в другом, в зависимости от порядка компиляции файлов).
package main
import "fmt"
var config string
func init() {
config = "default"
fmt.Println("First init: config set")
}
func init() {
if config == "" {
config = "fallback"
}
fmt.Println("Second init: config checked")
}
func main() {
fmt.Println("Config:", config)
}В этом примере обе init-функции выполняются до main. Первая устанавливает значение по умолчанию, вторая проверяет и корректирует его. Вывод будет:
First init: config set
Second init: config checked
Config: defaultinit-функции выполняются в порядке объявления в одном файле.init-функции выполняются до init-функций импортирующего пакета.init стоит только для простых операций, так как они усложняют тестирование и отладку.Неограниченное количество init-функций в пакете даёт гибкость для модульной инициализации, но злоупотреблять ими не стоит. Лучше применять для регистрации драйверов или установки глобальных конфигураций, избегая сложной логики.