Функция инициализации () Голанга

задняя часть Go
Функция инициализации () Голанга

Это третий день моего участия в Gengwen Challenge.Подробности о мероприятии, пожалуйста, проверьте:Обновить вызов
Если ❤️моя статья оказалась полезной, ставьте лайк и подписывайтесь. Это самый большой стимул для меня продолжать техническое творчество.Больше прошлых статей в моем личном блоге

Функция инициализации () Голанга

Возьмем пример

package main

import "fmt"

func init()  {
	fmt.Println("init() 1:", a)
}

func init()  {
	fmt.Println("init() 2:", a)
}

var a = 10
const b = 100

func main() {
	fmt.Println("main() :", a)
}

// 执行结果
// init() 1: 10
// init() 2: 10
// main() : 10

что такое инициализация()

существуетGoВ процессе проектирования языка сохраняются две функции по умолчанию:main()а такжеinit()функция.

Разница между ними заключается в следующем:

  • main()функция может использоваться только вmainпакет, и каждыйmainпакет может иметь только一个main()функция
  • но дляinit()функция, может использоваться во всех пакетах. А программа (даже файл) может записать сколько угодноinit()функция.

Примечание: Вы можете написать сколько угодно в программе (или даже в файле)init()функция, но для поддержки кода可读性,排查问题не приносит никакой пользы

функции init()

  • init()используется для程序运行前Инициализация пакета (пользовательские переменные, установленные коммуникационные соединения) работают
  • 每个包,每个程序文件Одновременно можно иметь несколько init(), но不建议
  • Несколько в одном пакете или файлеinit() 执行顺序, явно не в Голанге
  • разные пакетыinit()порядок исполнения согласно导入包的依赖关系Принимать решение
  • init()не может вызываться другими функциями, но автоматически在main函数执行前называться

- ссылка изeffective_go

когда init() выполняется

init()Функция — Голанг程序初始化часть включения.

Программно на Голанге初始化先于 main()Реализация: конкретнаяruntimeИнициализируйте каждый импортированный пакет.

  • Последовательность инициализации следующая解析的依赖关系порядок исполнения,Пакеты без зависимостей инициализируются первыми.
  • Сначала инициализируется область действия каждого пакета.常量,变量(где: константы идут перед переменными), а затем выполнить внутреннюю часть пакетаinit().
  • Один и тот же пакет и файл могут быть同时拥有Множественная инициализация().
  • init() — это то же самое, что и main(),没有任何参数和返回值, не может вызываться другими функциями.
  • тот же пакет, файл多个 init()Порядок выполнения не ясен.

Сводка порядка выполнения: import -> const -> var -> init() -> main()