Go 初始化 #
golang 程序初始化先于 main 函数执行,由 runtime 进行初始化,初始化顺序如下:
- 初始化导入的包(包的初始化顺序并不是按导入顺序(“从上到下”)执行的,runtime 需要解析包依赖关系,没有依赖的包最先初始化,与变量初始化依赖关系类似,参见 golang 变量的初始化);
- 初始化包作用域的变量(该作用域的变量的初始化也并非按照 “从上到下、从左到右” 的顺序,runtime 解析变量依赖关系,没有依赖的变量最先初始化,参见 golang 变量的初始化);
- 执行包的 init 函数;
- 变量初始化 ->init ()->main ()
- 由于 pack 包的初始化依赖 test_util,因此运行时先初始化 test_util 再初始化 pack 包;
- 同一个包不同源文件的 init 函数执行顺序,golang spec 没做说明
- 一般是源文件名称的字典序,但不能依赖这个假定
- 在每一个初始化周期,运行时(runtime)会挑选一个没有任何依赖的变量初始化
- 该过程一直持续到所有的变量均被初始化或者出现依赖嵌套的情形
- 同一个 package 下多个文件的变量初始化依赖也遵循相同的规则
变量初始化 #
不同作用域类型的变量初始化顺序不同
函数作用域内的局部变量 #
初始化顺序:从左到右、从上到下
package 级别的变量 #
初始化顺序与初始化依赖
有关
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。