在 Ubuntu 上用 Go(Golang)编译程序时,有几个常见点和坑需要注意,下面按环境、编译、交叉编译、部署几个方面总结:
Ubuntu 自带仓库的 Go 版本可能较旧:
sudo apt install golang
go version
建议使用官方二进制:
wget https://go.dev/dl/go1.22.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.linux-amd64.tar.gz
配置环境变量(~/.bashrc 或 ~/.zshrc):
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
go build main.go
或整个模块:
go build ./...
go build -o myapp main.go
go mod init myproject
go mod tidy
避免旧式 GOPATH 模式带来的混乱。
如果 go mod download 慢:
go env -w GOPROXY=https://goproxy.cn,direct
例如编译 Linux ARM:
GOOS=linux GOARCH=arm64 go build -o app-arm64 main.go
Windows:
GOOS=windows GOARCH=amd64 go build -o app.exe main.go
Mac(Intel):
GOOS=darwin GOARCH=amd64 go build -o app-mac main.go
查看支持平台:
go tool dist list
go build -ldflags="-s -w" -o app main.go
可进一步用 upx:
upx --best app
CGO_ENABLED=0 go build -o app main.go
✅ 推荐用于 Docker / Alpine
如果你的代码用了:
netos/user会依赖系统 C 库。
Ubuntu 上需要:
sudo apt install gcc libc-dev
纯静态部署建议:
CGO_ENABLED=0 go build
chmod +x app
./app
需要:
sudo setcap cap_net_bind_service=+ep app
或直接使用 >1024 端口 + 反向代理
FROM golang:1.22 AS build
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o app
FROM alpine
COPY --from=build /app/app /app
CMD ["/app"]
| 问题 | 原因 |
|---|---|
command not found: go |
PATH 没配置 |
cannot find package |
没用 go mod |
| 二进制在 Alpine 跑不了 | 开了 CGO |
| 编译很慢 | 依赖太多 / 没缓存 |
| 运行报错 glibc | 交叉编译不一致 |
如果你愿意,可以告诉我:
我可以给你针对性的编译命令和 Dockerfile。