Go程序入口必须是package main中的func main(),无参数无返回值;命令行参数用os.Args获取,退出码用os.Exit(n)设置;main只能在main包中,且初始化后最后执行。
Go 程序的入口必须是 main 函数,且必须位于 package main 中;不满足任一条件,go run 或 go build 会直接报错退出。
Go 不允许 main 函数带参数或返回值。以下写法全部非法:
func main(args []string) —— 编译错误:function main must have no arguments and no return values
func main() int —— 同样触发上述错误func main() (int, error) —— 错误同上命令行参数需通过 os.Args 显式获取,退出状态需调用 os.Exit(n)(默认成功退出码为 0)。
Go 规定:只有 package main 才能包含 main 函数。其他包(如 package utils)定义 func main() 不会报错,但无法作为可执行程序启动 —— go run 会提示 no Go files in current directory(若当前无 main 包),或忽略该函数。
常见误操作:
main.go,但没进该目录就执行 go run . → 实际运行的是上级目录的包(可能非 main).go 文件混在同一个目录,其中一个是 package utils,另一个是 package main → 编译失败:cannot mix package utils
and package main in same directory
Go 的初始化流程是:包级变量初始化 → init() 函数(按文件名和声明顺序)→ main()。这意味着:
main() 总是最后执行,且只执行一次main() 外部调用 main() —— 这是语法错误:undefined: main(因为 main 不是导出标识符)init(),会导致 panic(例如循环初始化)示例:以下代码会 panic,因为 v 初始化时 initA 尚未执行:
package main
var v = initA()
func init() {
initA()
}
func initA() int {
return 42
}
func main() {
println(v)
}
main 函数本身不参与平台适配;Go 通过构建标签(build tags)或 GOOS/GOARCH 环境变量控制编译目标,但 main 的签名和位置规则始终不变。唯一要注意的是:
main,而要靠链接器标志(-ldflags -H=windowsgui)或调用系统 APImain 仍必须符合 Go 规则;C 主函数(如 main(int, char**))会被 Go 运行时接管,不可手动替换真正容易被忽略的点是:很多人以为可以靠重命名 main 函数 + 链接器符号替换来绕过限制,但 Go 编译器硬编码检查函数名和包名,这条路完全走不通。