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>
程序在用户层面的执行逻辑,会在这个函数内按照它的调用顺序展开。
package main
func main() {
// 用户层执行逻辑
... ...
}
init: Go包的初始化函数
func init() {
// 包初始化逻辑
... ...
}
:::warning
如果 main 包依赖的包中定义了 init 函数,或者是 main 包自身定义了 init 函数,那么 Go 程序在这个包初始化的时候,就会自动调用它的 init 函数,因此这些 init 函数的执行就都会发生在 main 函数之前:::
Go 包的初始化次序
:::info 只要这个包导入了,即时没有使用,也会初始化
:::
Go 包的初始化次序- 依赖包按“深度优先”的次序进行初始化
- 每个包内按以“常量 -> 变量 -> init 函数”的顺序进行初始化
- 包内的多个 init 函数按出现次序进行自动调用。