请说明 Go 语言中 init() 函数的触发时机,即在程序的哪个阶段会被调用。
考察说明
考察对 Go 语言初始化机制的理解,包括执行顺序与使用限制。
回答思路
- 【回答框架 1】init() 函数在包被初始化时执行,发生在变量初始化完成之后,且在 main() 执行之前。每个包下可以定义多个 init(),执行顺序按照文件名字母顺序,包间依赖顺序则按导入顺序。
- 【回答框架 2】init() 无法被显式调用,只能由系统自动执行。它没有参数和返回值,常用于初始化全局变量、注册驱动或加载配置等场景。
- 【回答框架 3】对于包依赖,运行时先初始化所有依赖的包,再初始化当前包。因此 init() 的执行顺序由包的导入关系决定,形成依赖链。
- 【回答框架 4】同一包内多个源文件的 init() 按文件名字符串排序执行,同一文件内按出现顺序执行。不同 init() 之间无法保证顺序(除非依赖),实际设计时应避免依赖执行顺序。
- 【关键点 1】init() 在包初始化时自动执行,先于 main()。
- 【关键点 2】每个包可以定义多个 init(),执行顺序有明确规则。
- 【关键点 3】init() 不能有参数和返回值,不被显式调用。
- 【易错点 1】不要依赖同包内不同文件 init() 的执行顺序,除非通过设计保证。
- 【易错点 2】init() 中执行耗时操作可能影响程序启动时间。
- 【易错点 3】init() 无法被测试直接调用,相关逻辑难以单测,必要时抽离为普通函数。