- 自动调用: init函数不需要在代码中显式调用,Go语言会在程序启动时自动执行init函数。具体而言,当一个包被导入时,Go会在执行任何其他代码之前自动调用该包中的init函数。
- 无参数、无返回值: init函数不能有任何参数和返回值。这与其他普通的Go函数不同。
- 一次调用: init函数在整个app运行周期只会被执行一次,通常是在包首次被导入时。
- 每个包可以定义多个
init
函数: 一个包中可以定义多个init函数,甚至可以在同一个源文件中定义多个init函数。它们的执行顺序是按照它们在文件中出现的顺序。 - 每个文件也可以有多个init函数: Go允许在同一包的不同源文件中定义init函数。这些init函数会根据文件的编译顺序来执行。
init
函数调用顺序:
- 在单个包中,如果有多个init函数,它们会按照在源文件中的声明顺序执行。
- 在多个包之间,init函数会按照包的导入顺序执行。如果包A导入了包B,则先执行包B的init函数,然后再执行包A的init函数。
init
函数通常用于以下场景:
- **配置初始化:**初始化一些配置参数,比如读取配置文件或环境变量。
- **变量初始化:**在程序开始时初始化包级别的变量。
- **注册函数:**在某些框架中,通过init函数进行自动注册操作。
- 避免在
init
函数中启动服务: 虽然整个函数周期init
函数只会执行一次,很方便用于启动持久化服务;但是由于包导入顺序导致的执行顺序以及可能导致的多次运行等多种不利于维护的问题,应该且只应该在init
函数里实现初始化,在main
函数里统一启用服务。