go的init函数是什么时候执行的?
题目来源:高德
答案1:
init函数的主要作用:
1)初始化不能采用初始化表达式初始化的变量。
2)程序运行前的注册。
3)实现sync.Once功能。
4)其他init函数的主要特点:
1)init函数先于main函数自动执行,不能被其他函数调用;
2)init函数没有输入参数、返回值;
3)每个包可以有多个init函数;
4)包的每个源文件也可以有多个init函数,这点比较特殊;
5)同一个包的init执行顺序,golang没有明确定义,编程时要注意程序不要依赖这个执行顺序。
6)不同包的init函数按照包导入的依赖关系决定执行顺序。golang程序初始化
golang程序初始化先于main函数执行,由runtime进行初始化,初始化顺序如下:
1)初始化导入的包(包的初始化顺序并不是按导入顺序(“从上到下”)执行的,runtime需要解析包依赖关系,没有依赖的包最先初始化,与变量初始化依赖关系类似,参见golang变量的初始化);
2)初始化包作用域的变量(该作用域的变量的初始化也并非按照“从上到下、从左到右”的顺序,runtime解析变量依赖关系,没有依赖的变量最先初始化,参见golang变量的初始化);
3)执行包的init函数;
故,最终初始化顺序:变量初始化 -> init() -> main()