Go面试题更新 2026-08-03

请说明 Go 语言中 init() 函数的触发时机,即在程序的哪个阶段会被调用。

考察说明

考察对 Go 语言初始化机制的理解,包括执行顺序与使用限制。

回答思路

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