- 一个程序只能有一个main的package. 且pack main 会包含一个main的函数.
- pack main会包含多个其他的pack. 这里我们假设还有pack1, pack3.
- pack可能还会包含其他的pack. 这里我们假设 pack1. 还包含了 pack2 .
- 所有的 pack 都可以包含0个至多个init函数. 没错. 可以有多个init函数... ...
现在讨论init的调用情况. 结论看起来是
- 所有的 pack 都可以包含0个至多个init函数. 没错. 可以有多个init函数... ...
- 包之间没有关系的情况下 . 按照import的先后顺序执行. 与包函数的调用顺序无关. ~~~ 静态编译
- 看起来是深度递归操作. 永远最先执行最后被包含的pack的init函数.
- 同一个pack的多个文件中的init函数是按照文件名的排序来执行的.
- 同一个pack的同一个文件也可以有多个init函数.... (神经病). 文本顺序执行.
在一个go文件中, 初始化顺序规则: (1)引入的包 (2) 当前包中的变量常量 (3) 当前包的init (4)main函数
文件结构如下.
.
|-- main.go
|-- pack1
| |-- pack0.go
| |-- pack1.go
| `-- pack11.go
|-- pack2
| `-- pack2.go
`-- pack3
`-- pack3.go
代码见
https://github.com/sssandy/golang_test/tree/master/init_test
输出为
test pack3 init
test pack2 init
test pack00 init
test pack1 init before
test pack1 init after
test pack11 init
main init
main
ps: 包级别的变量也是这么个初始化顺序.
有疑问加站长微信联系(非本文作者)