
Go 中 init 是保留的包初始化函数名,不能手动调用;若需自定义无参无返回值函数,应使用其他合法函数名并在 main 中显式调用。
go 中 `init` 是保留的包初始化函数名,不能手动调用;若需自定义无参无返回值函数,应使用其他合法函数名并在 `main` 中显式调用。
在 Go 语言中,init() 函数具有特殊语义:它是 Go 运行时自动调用的包初始化函数,用于执行包级变量初始化、状态预设等操作。根据 Go 语言规范,每个源文件可定义多个 init 函数,它们会在 main 函数执行前按导入顺序自动运行,且不允许被显式引用或调用——包括在 main 中写 init() 会导致编译错误:
./main.go:10:2: cannot call non-declared function init
因此,您在注释掉 // init() 后程序仍输出 "init!",正是因为 init 函数被自动触发;而尝试取消注释调用则会编译失败。
✅ 正确做法:为自定义逻辑命名一个普通函数(如 setup、doWork 或 printHello),并显式调用:
package main
import "fmt"
func init() {
fmt.Println("init!") // 自动执行:包初始化逻辑
}
func printHello() { // 普通函数,无参数、无返回值
fmt.Println("Hello from printHello!")
}
func main() {
printHello() // ✅ 正确:显式调用
fmt.Println("main")
}
输出:
init! Hello from printHello! main
⚠️ 注意事项:
- init 函数仅用于包初始化,不可带参数、不可有返回值、不可被导出(即首字母小写)、不可被直接调用;
- 同一包内可定义多个 init 函数,但执行顺序由编译器决定(按源文件字典序 + 声明顺序),不建议依赖其执行顺序;
- 若函数仅用于 main 逻辑且无需包级初始化,优先使用普通函数名,保持语义清晰、可测试、可复用。
总结:Go 的 init 是语法保留字,不是普通函数别名。要实现“在 main 中调用无参无返回值函数”,只需避开 init 等保留名(如 main、init),使用任意合法标识符定义函数,并在 main 中直接调用即可。











