本篇基于 Go 1.25.1 版本,深入讲解 main 函数作用、规则、参数、执行逻辑,彻底吃透程序入口!
一、什么是 main 函数?
main 函数是 Go 程序的唯一入口
- • 程序运行时第一个执行的函数
- • 必须放在
main包下 - • 无参数、无返回值
- • 一个项目只能有一个入口 main 函数
二、main 函数核心规则(必背表格)
| 规则项 | 要求 | 说明 |
|---|---|---|
| 所属包 | 必须在 package main | 不是 main 包无法运行 |
| 函数名 | 必须是 main | 大小写固定,不能修改 |
| 参数 | 无参数 | 不能写 func main(x int) |
| 返回值 | 无返回值 | 不能写 func main() int |
| 数量 | 一个项目仅一个 | 多个 main 函数编译报错 |
| 执行顺序 | 最后执行 | 先 init → 后 main |
三、标准 main 函数写法
package main // 必须是 main 包
import "fmt"
// 程序唯一入口
func main() {
fmt.Println("✅ Go 程序启动成功!")
}四、程序执行顺序(超重要)
固定执行流程:
- 1. 初始化依赖包变量
- 2. 执行依赖包
init函数 - 3. 初始化 main 包变量
- 4. 执行 main 包
init函数 - 5. 最后执行 main 函数
五、命令行参数(os.Args)
main 函数不能定义参数,但可以通过 os.Args 获取外部参数。
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("程序参数:", os.Args)
// 遍历参数
for i, arg := range os.Args {
fmt.Printf("参数%d:%s\n", i, arg)
}
}运行并传参:
go run main.go hello go 123六、程序退出(返回状态)
main 函数没有返回值,使用 os.Exit(码) 退出程序。
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("程序准备退出")
// 0=正常退出,非0=异常
os.Exit(0)
}七、完整可运行 Demo(全覆盖知识点)
main.go 本地可直接跑通,零语法错误👇
// 必须是 main 包
package main
import (
"fmt"
"os"
)
// 包变量初始化(先执行)
var appVersion = "1.0.0"
// init 先于 main 执行
func init() {
fmt.Println("[init] 初始化完成,版本:", appVersion)
}
// 程序唯一入口
func main() {
fmt.Println("\n[main] 程序启动成功!")
// 打印命令行参数
fmt.Println("\n=== 命令行参数 ===")
if len(os.Args) > 1 {
for i, v := range os.Args {
fmt.Printf("参数 %d:%v\n", i, v)
}
} else {
fmt.Println("未传入任何参数")
}
fmt.Println("\n✅ 程序执行完毕!")
}运行命令
go run main.go带参数运行
go run main.go 学习 main 函数八、新手必避坑(超级重要)
- 1. 必须写 package main
不在 main 包 → 无法运行 - 2. main 函数不能有参数/返回值
编译直接报错 - 3. 一个项目只能有一个 main 函数
- 4. 想获取外部参数用 os.Args
- 5. 想退出程序用 os.Exit(0)
- 6. init 先执行,main 后执行
九、main 函数常用场景
✅ 项目启动入口
✅ 加载配置
✅ 初始化服务
✅ 启动 HTTP/GRPC 服务
✅ 处理命令行工具
✅ 程序退出控制
📌 总结
- 1. main 函数 = 程序唯一入口
- 2. 必须在 package main 下
- 3. 无参数、无返回值
- 4. 执行顺序:init → main
- 5. 命令行参数:os.Args
- 6. 退出程序:os.Exit
一篇搞定 Go 程序入口,新手直接通关程序启动逻辑 ✨
MiaoAll