
go 中 init 是保留关键字,专用于包初始化,不能手动调用;若需自定义无参无返回值函数,应使用其他函数名并在 main 中显式调用。
go 中 init 是保留关键字,专用于包初始化,不能手动调用;若需自定义无参无返回值函数,应使用其他函数名并在 main 中显式调用。
在 Go 语言中,init() 函数具有特殊语义:它不是普通函数,而是由编译器自动识别并执行的包初始化函数。每个包(包括 main 包)可定义多个 init 函数,它们会在 main 函数执行前按声明顺序自动运行,且不允许被显式调用、赋值、取地址或作为参数传递——这是 Go 语言规范(Package initialization)明确规定的限制。
因此,以下代码会编译失败:
func init() {
fmt.Println("init!")
}
func main() {
init() // ❌ 编译错误:cannot call non-declared function init
fmt.Println("main")
}✅ 正确做法是:为自定义逻辑命名一个非保留标识符(如 setup、prepare、runTask 等),然后在 main 函数中显式调用:
package main
import "fmt"
func init() {
fmt.Println("→ package init: runs automatically before main")
}
func setup() { // ✅ 自定义无参无返回值函数
fmt.Println("→ setup: called manually in main")
}
func main() {
setup() // ✅ 合法调用
fmt.Println("→ main: program entry point")
}输出结果为:
→ package init: runs automatically before main → setup: called manually in main → main: program entry point
⚠️ 注意事项:
- init 函数仅用于包级初始化(如设置全局变量、注册驱动、初始化配置等),不应承载业务逻辑;
- 若需复用初始化逻辑,可将其封装为普通函数(如 initDB()、loadConfig()),再在 init 或 main 中调用;
- 同一文件中可定义多个 init 函数,但它们的执行顺序依赖于源文件内声明顺序及导入依赖关系,不建议过度依赖此行为;
- 所有 init 函数必须无参数、无返回值,且不能重名(否则编译报错)。
总结:Go 的 init 是语法层面的“钩子”,而非普通函数。要实现可调用的无参无返回值逻辑,请始终使用自定义函数名,并在 main 或其他合适位置显式调用。


















