Go支持init函数在main()之前执行初始化代码。当Go程序运行时,编译器会自动调用每个包中声明的所有init函数,在包的变量初始化之后。
问题背景: 需要在包使用之前仅准备一次状态。
问题: init的初始化顺序常常会导致隐性错误:很难控制特定的init函数在何时被调用,特别是在包之间存在多个依赖关系时。
解决方案:
代码示例:
package example import "fmt" var Cfg string = "default" func init() { fmt.Println("example init") Cfg = "configured" }
主要特点:
一个文件中可以定义多个init函数吗?
可以,允许多个init函数——它们会按照声明的顺序被调用。
如果包仅被间接导入(通过_ "package")会发生什么?
只会执行该包的init函数和变量初始化。
Init函数可以返回值或错误吗?
不可以。init的签名是固定的:func init(),没有参数和返回值。
一个大型项目依赖于复杂的init函数,初始化具有包间依赖关系的全局状态。导致了浮动的启动错误。
优点:
缺点:
Init仅用于基本或特定测试的任务,其他的移到从main()调用的显式函数中。启动顺序显而易见,测试变得简单。
优点:
缺点: