跳到主要内容

Go 语言的 init 函数执行顺序

· 阅读需 2 分钟
素明诚
Full stack development

单个 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