一篇文了解 Go的 init 函数---目的、执行和最佳实践
文章目录
- Go init 函数
- 例子实践
- 实例 1: init的基本使用
- 实例 2: 使用init对全局变量初始化
- 实例3: init 在多文件中
- 实例4: init 在不同的包中
- 何时使用 init?
- 良好用例
- 避免在以下情况下使用 init
- 总结:
Go init 函数
在 Go 中,init 函数是一个特殊函数,当软件包初始化时,它会在主函数之前自动执行。它主要用于设置任务,如初始化全局变量、打开数据库连接或注册依赖关系。
init 函数的主要特点:
- 无参数和无返回值 - init 函数不接受参数或返回值。
- 自动执行 - 它在 main() 之前运行,无需明确调用。
- 可以有多个init 函数 - 一个软件包可以有多个 init 函数,甚至可以跨越不同的文件。
- 按声明顺序执行 - 如果一个软件包中有多个 init函数,它们将按出现的顺序执行。
例子实践
实例 1: init的基本使用
package main
import "fmt"
func init() {
fmt.Println("Initializing...")
}
func main() {
fmt.Println("Main function running...")
}
输出:
Initializing...
Main function running...
结论: init ()函数运行在 main().函数之前
实例 2: 使用init对全局变量初始化
package main
import "fmt"
var config string
func init() {
config = "Application Configured"
fmt.Println("Configuring application...")
}
func main() {
fmt.Println(config)
}
输出: Application Configured
实例3: init 在多文件中
如果软件包有多个文件,所有初始函数都会按照出现的顺序在 main() 之前运行。
File 1: (a.go)
package main
import "fmt"
func init() {
fmt.Println("Init from a.go")
}
File 2 (b.go):
package main
import "fmt"
func init() {
fmt.Println("Init from b.go")
}
Main File (main.go)
package main
import (
"fmt"
)
func main() {
fmt.Println("Main function running...")
}
输出:(execution order is preserved):
Init from a.go
Init from b.go
Main function running...
实例4: init 在不同的包中
package utils
import "fmt"
func init() {
fmt.Println("Initializing utils package...")
}
func SayHello() {
fmt.Println("Hello from utils!")
}
Main File (main.go)
package main
import (
"fmt"
"your_project/utils"
)
func init() {
fmt.Println("Initializing main package...")
}
func main() {
fmt.Println("Main function running...")
utils.SayHello()
}
输出(Package-Level Execution Order)
Initializing utils package...
Initializing main package...
Main function running...
Hello from utils!
导入软件包中的 init 函数在 main 中的 init 函数之前运行。
何时使用 init?
良好用例
- 初始化全局变量。
- 设置日志配置。
- 注册依赖关系(如数据库连接)。
- 确保在 main() 运行前进行必要的设置。
避免在以下情况下使用 init
- 复杂逻辑(最好在 main 中明确初始化)。
- 业务逻辑(应放在 main 或其他函数中)。
总结:
- init() 会在 main() 之前自动运行。
- 它没有参数,也没有返回值。
- 每个软件包可以有多个 init 函数。
- 导入软件包中的init 会在 main 中的 init 之前运行