go build 是唯一需要的命令,它能直接产出静态链接的可执行文件,无需 go run、go install 或第三方工具;默认编译含 main 函数的包,生成跨平台单体二进制,但需注意 go.mod、-o 路径、GOOS/GOARCH 环境变量及 -ldflags="-s -w" 等关键细节。

go build 是唯一需要的命令
不需要 go run、go install 或第三方构建工具,go build 就能直接产出可执行文件。它默认把整个项目(含所有依赖)静态链接成单个二进制,不依赖目标机器装 Go 环境。
常见错误是误用 go run main.go —— 这只是临时运行,不会生成文件;或者在没 main 函数的包里执行 go build,报错 no Go files in current directory。
- 确保当前目录下有
main.go或含func main()的包 - 项目根目录应有
go.mod(用go mod init myapp初始化),否则可能漏依赖 - Linux/macOS 下生成无后缀文件(如
myapp),Windows 下自动加.exe后缀
指定输出名和路径用 -o 参数
-o 控制生成文件名和位置,但要注意 Windows 要求显式带 .exe 后缀,否则双击打不开。
例如:go build -o dist/app.exe cmd/myapp/main.go 会把 cmd/myapp 包编译成 dist/app.exe;而 go build -o app 在 Windows 下生成的是 app(非可执行),不是 app.exe。
立即学习“go语言免费学习笔记(深入)”;
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 路径必须指向含
main函数的包,不能是普通库包 -
-o后面跟的是完整路径(支持相对路径),不是目录名 - 若输出路径不存在,
go build不会自动创建父目录,会报错no such file or directory
跨平台编译必须设 GOOS 和 GOARCH
在 macOS 上编译 Windows 版,或在 Linux 上编译 macOS ARM64 版,只靠 go build 不行,必须提前设置环境变量。
典型组合:GOOS=windows GOARCH=amd64、GOOS=linux GOARCH=arm64、GOOS=darwin GOARCH=arm64。注意大小写敏感,goos(小写)无效,必须是 GOOS。
- cgo 项目跨平台时,务必加
CGO_ENABLED=0,否则可能因缺少交叉工具链失败 - 纯 Go 项目设
CGO_ENABLED=0更安全,避免意外链接 libc - PowerShell 中用
$env:GOOS="windows",不是set GOOS=windows(那是 CMD 语法)
生产环境要加 -ldflags="-s -w"
默认生成的二进制包含符号表和调试信息,体积大、易被逆向。上线前必须裁剪。
-s 移除符号表,-w 移除 DWARF 调试数据。两者常一起用:go build -ldflags="-s -w" -o app.exe main.go。体积通常能减少 30%–50%。
-
-ldflags是链接器参数,拼写错误(如写成-ld-flag)会导致静默忽略 - 如果项目用了 cgo,加
-ldflags="-extldflags '-static'"可强制静态链接,但需对应平台交叉工具链支持 - 图标、版本信息等 Windows 特性需额外步骤(如
goversioninfo或winres),不属go build原生能力
-s -w 仍有效,但静态链接需额外参数;而 cgo 关闭时,-ldflags 中某些选项(如 -H windowsgui)才真正起作用。

















