init()用于在程序启动时初始化包中的变量或执行一些预备操作。它具有以下特点和用途:
-
自动执行:
init() 函数会在包被加载时自动执行,无需手动调用。
每个 Go 文件可以包含一个或多个 init() 函数,所有的 init() 函数在主程序执行之前会被依次执行。 -
执行顺序:
- 同一个go文件内,按照定义顺序,即从上到下依次执行 init() 函数。
- 如果一个包依赖于其他包,依赖包的 init() 函数会先执行,然后再执行当前包的 init()。
- 在同一个包中,init() 函数的执行顺序是按照文件的编译顺序(通常是文件名的字母顺序)来决定的。
-
用途:
- 初始化变量或数据结构。
- 设置配置参数。
- 注册某些程序运行时所需的资源。
- 在执行 main() 函数之前执行一些前置逻辑。
-
限制:
- init() 函数不能有参数,也不能有返回值。
- 它通常用于包的内部初始化操作,而不应用于业务逻辑。
- 不建议在 init() 函数中执行复杂或耗时的操作,以免影响程序启动速度。
-
与 main() 的关系:
- main() 是程序的入口点,而 init() 是在 main() 之前执行的。
- init() 函数在 main() 函数执行前完成所有的初始化工作。
-
示例:
package main
import (
"fmt"
)
var num int
func init() {
fmt.Println("init() called")
num = 100
}
func main() {
fmt.Println("main() called")
fmt.Println("num =", num)
}
在这个示例中,init() 会在 main() 之前执行,初始化 num 的值。
-
多 init() 函数:
是的,同一个包、go文件内可以同时放多个init().
并且它们将按照定义的顺序依次执行。 -
最佳实践:
- 应用 init() 时保持简洁,尽量避免复杂逻辑。
- 不要滥用 init(),应考虑清楚是否有必要在 init() 中初始化,而不是直接在变量声明时初始化。


