Go 语言的 init 函数执行顺序
· 阅读需 2 分钟
单个 Go 文件中的多个 init 函数
一个 Go 文件内可以包含多个 init
函数,这些函数将按照它们在文件中的出现顺序被执行这一点对于初始化本地资源或配置特别有用
示例代码
// 文件config.go
package config
import "fmt"
func init() {
fmt.Println("初始化数据库连接")
}
func init() {
fmt.Println("加载应用配置")
}
输出结果
初始化数据库连接
加载应用配置
同一 package 中的多个 Go 文件中的 init 函数
如果一个 package 包含多个 Go 文件,那么各文件中的 init
函数将按文件名的字母顺序执行这对于需要跨文件初始化顺序的场景非常关键
示例代码
// 文件a_init.go
package setup
import "fmt"
func init() {
fmt.Println("Setup part 1")
}
// 文件b_init.go
package setup
func init() {
fmt.Println("Setup part 2")
}
输出结果
Setup part 1
Setup part 2
不同 package 的 init 函数执行顺序
当一个 package 导入其他多个 package 时,被导入的 package 的 init
函数将按照 import 语句的顺序执行,再执行当前 package 的 init
函数这有助于管理复杂的依赖关系
示例代码
// 文件database.go
package database
import "fmt"
func init() {
fmt.Println("Database initialized")
}
// 文件server.go
package main
import (
"fmt"
"sumingcheng.com/project/database" // 路径假设为例子
)
func init() {
fmt.Println("Server setup")
}
func main() {
fmt.Println("Server starting")
}
输出结果
Database initialized
Server setup
Server starting
非 main package 的 init 函数执行顺序
即便是在非 main package 中,init
函数也是在包的任何其他代码执行前执行,包括 main 函数这保证了无论程序的入口点在哪里,所有必要的初始化都能先行完成
示例代码
// 文件logger.go
package logger
import "fmt"
func init() {
fmt.Println("Logger setup complete")
}
// 文件main.go
package main
import (
"sumingcheng.com/project/logger" // 假设的路径
)
func main() {
fmt.Println("Main function running")
}
输出结果
Logger setup complete
Main function running