Go 语言中 init() 函数在什么时候执行?
Go 语言中 init() 函数在什么时候执行?
回答重点
init() 函数在 Go 程序执行之前自动调用,会在 main() 函数执行之前。
它用于初始化包级别的变量,用来设置初始状态或者执行一次性初始化操作(它不能有参数,也不能返回值)。每个包中的 init() 函数在该包的其他代码执行之前运行,每个包可以有多个 init() 函数。
执行顺序:
- 包的初始化顺序:如果一个包被多个包依赖,Go 会首先执行所有导入的包的
init()函数,依赖的包init()函数会先执行。 - 同一个包内的多文件多
init()函数:以文件名的顺序调用init(),同一个文件内的多个init()则是以出现的顺序依次调用。 - 程序入口:最终在
main()函数开始执行之前,所有相关包的init()函数都已经执行完毕。
以下图片来自《Go语言高级编程》:
扩展知识
注意点
在 main.main 函数执行之前所有代码都运行在同一个 Goroutine 中,即主系统线程中。
但是如果某个 init() 函数内部用启动了新的 Goroutine ,那么新的 Goroutine 和 main.main 函数是并发执行的。
使用场景与实际例子
初始化数据库连接:init() 可以用于初始化数据库连接或进行其他资源的配置。
1 | func init() { |
注册自定义的日志记录器:当程序启动时,init() 可用于设置全局的日志记录配置。
1 | func init() { |
Comments