8. 入口函数与包初始化:搞清Go程序的执行次序

8.1 问题

一个Go项目中有数十个Go包,每个Go包中又有若干常量、变量、各种函数和方法。

那么Go代码究竟是从哪里开始执行的? 后续的执行顺序又是什么样的

8.2 Go代码从哪里开始执行的

main.main

<font style="color:rgb(51, 51, 51);">Go</font> 语言中有一个特殊的函数:<font style="color:rgb(51, 51, 51);">main</font> 包中的 <font style="color:rgb(51, 51, 51);">main</font> 函数,也就是 <font style="color:rgb(51, 51, 51);">main.main</font>,它是所有 **<font style="color:#F5222D;background-color:#FADB14;">Go</font>** 可执行程序的用户层执行逻辑的入口函数<font style="color:rgb(51, 51, 51);">Go</font> 程序在用户层面的执行逻辑,会在这个函数内按照它的调用顺序展开。

  1. package main
  2. func main() {
  3. // 用户层执行逻辑
  4. ... ...
  5. }

init: Go包的初始化函数

  1. func init() {
  2. // 包初始化逻辑
  3. ... ...
  4. }

:::warning

如果 main 包依赖的包中定义了 init 函数,或者是 main 包自身定义了 init 函数,那么 Go 程序在这个包初始化的时候,就会自动调用它的 init 函数,因此这些 init 函数的执行就都会发生在 main 函数之前

:::

Go 包的初始化次序

2. 入门篇 勤加练手 - 图1

:::info 只要这个包导入了,即时没有使用,也会初始化

:::

Go 包的初始化次序
  • 依赖包按“深度优先”的次序进行初始化
  • 每个包内按以“常量 -> 变量 -> init 函数”的顺序进行初始化
  • 包内的多个 init 函数按出现次序进行自动调用。