介绍
init()函数是一个特殊的函数,存在一下特性
- 不能被其它函数调用,而是子main()函数之前自动调用
- 不能作为参数传入
- 不能有传入参数和返回值
作用:
- 对变量进行初始化
- 检查/修复程序状态
- 注册
- 运行一次计算
以下是<<the way to go>>的解释:
变量除了可以在全局声明中初始化,也可以在 init ()函数中初始化。这是一类非常特殊的函数,它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main 函数高。
每个源文件都只能包含一个 init() 函数(此处存在错误)。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。
使用
- 每个源文件都可以包含多个init()函数
- 导入包的顺序决定了init函数的执行顺序
go中不同包中init函数的执行顺序是根据包的导入关系决定。
init函数调用关系:图片来源网络
场景
-
对变量进行初始化
package mainimport ("math"
)var pi float64func init() {pi = 4 * math.Atan(1)}
- 在程序开始前,调用后台执行goroutine
package mainfunc init() {go backend()}
- 连接数据库
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx"
)var Db *sqlx.DBfunc init() {database, err := sqlx.Open("mysql", "root:xxx@tcp(127.0.0.1:3306)/test")if err != nil {fmt.Println("open mysql fail", err)return}Db = database
}