go build 不加参数时,若当前目录含 package main,则生成同名可执行文件;否则报错;明确构建需指定路径如 go build cmd/myapp/main.go,并用 -o 定制输出名。

go build 生成可执行文件时,当前目录决定输出行为
直接运行 go build 不加参数,会按当前目录结构决定构建目标:如果在 cmd/myapp 下执行,且该目录含 package main,则生成名为 myapp 的二进制;若在项目根目录(含 go.mod 但无 main)执行,则报错 no Go files in ...。
- 想明确构建某个命令,用
go build cmd/myapp/main.go—— 输出文件名默认为main,需配合-o指定名称 - 跨平台编译必须提前设环境变量,例如
GOOS=linux GOARCH=amd64 go build -o myapp-linux ./cmd/myapp - 不推荐在
GOPATH/src下构建老式项目,现代项目应始终以模块根目录为工作目录
Makefile 中定义构建规则,避免重复写平台组合
手动敲 GOOS=xxx GOARCH=yyy go build 容易漏掉组合、拼错变量。用 Makefile 把常见目标固化下来更可靠,比如:
build-linux: export GOOS = linux build-linux: export GOARCH = amd64 build-linux: go build -o bin/myapp-linux ./cmd/myapp build-darwin-arm64: export GOOS = darwin build-darwin-arm64: export GOARCH = arm64 build-darwin-arm64: go build -o bin/myapp-darwin-arm64 ./cmd/myapp
- 每条规则前用
export设置局部环境变量,不影响后续其他 rule - 输出路径统一用
bin/目录,避免散落在各处;该目录应加入.gitignore - 不要在 Makefile 里写
rm -rf bin/ && mkdir bin——go build -o会自动覆盖,多此一举还可能因权限失败
go install 和 GOPATH/bin 的关系已变,别再依赖它
Go 1.16+ 默认启用 GO111MODULE=on,go install 不再把二进制扔进 $GOPATH/bin,而是要求带版本号或使用 -o 显式指定路径,否则报错 cannot install from module root。
- 正确做法:先确保模块有语义化版本(如
v0.1.0),再运行go install example.com/myapp@v0.1.0 - 开发阶段想快速试运行,用
go run ./cmd/myapp更安全——它不生成文件,也不受GOBIN影响 - 若仍需全局可用命令,建议用
go build -o $HOME/bin/myapp ./cmd/myapp手动复制,可控性更强
构建产物体积大?检查是否启用了调试信息和符号表
默认构建的二进制包含 DWARF 调试信息,对生产部署没用却增加几 MB 体积。上线前务必 strip:
- 加
-ldflags="-s -w":去掉符号表(-s)和 DWARF(-w),通常能减小 30%~50% - 注意顺序:
-ldflags必须紧接go build后,不能写成go build -ldflags "-s -w" .(少空格会失效) - 交叉编译时同样适用,比如
GOOS=linux go build -ldflags="-s -w" -o myapp-linux ./cmd/myapp
go.mod 文件不在当前工作目录,导致 go 工具 fallback 到旧式 GOPATH 模式,依赖解析错乱、replace 不生效、甚至 silently 编译了错误版本的包。每次执行前,先确认 pwd 输出的是模块根目录。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











