Ubuntu编译Golang的最佳实践
-ldflags="-s -w"
组合去除符号表(-s
)和DWARF调试信息(-w
),显著减小生产环境二进制文件体积(通常可减少30%~50%),但会失去调试能力,仅适用于发布版本。-trimpath
标志,移除编译时的绝对路径信息,进一步减小文件体积并增强可移植性。-gcflags="-l=4"
设置更高的编译优化级别(默认为1,最大为4),提升运行时性能,但对编译时间影响较小。-p
参数指定并行编译的进程数(如-p 8
),充分利用多核CPU资源(建议设置为CPU核心数的80%~100%),大幅缩短大型项目的编译时间。-buildcache true
显式启用),缓存已编译的包,避免重复编译未修改的代码。GOCACHE
环境变量指定缓存路径(如export GOCACHE=/tmp/go-cache
),避免占用系统默认缓存目录的空间,尤其适合磁盘空间有限的场景。go mod init <module-name>
初始化项目,go mod tidy
自动下载/整理依赖),确保项目依赖的一致性和可复现性。go env -w GOPROXY=https://goproxy.cn,direct
设置国内代理(如七牛云),加速依赖包的下载(尤其在国内网络环境下效果显著)。go mod vendor
将依赖复制到项目根目录的vendor
文件夹,避免每次编译都从远程仓库下载依赖,适合离线环境或需要固定依赖版本的场景。GOOS
(目标操作系统,如linux
、windows
、darwin
)和GOARCH
(目标架构,如amd64
、arm64
)指定目标平台,例如GOOS=linux GOARCH=amd64
编译Linux 64位程序。CGO_ENABLED=0
,避免依赖C库(如libc
),简化编译流程并提高可移植性(生成的二进制文件为静态链接,无需额外依赖)。CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o myapp-linux main.go
(编译Linux 64位静态程序)。sudo apt install upx
),通过upx --best --lzma <binary>
命令压缩编译后的二进制文件(如upx --best --lzma myapp-linux
),可进一步减小文件体积(通常可减少50%~70%),但会增加少量启动时间(对性能影响极小)。utils
包)拆分为更小的子包(如utils/string
、utils/file
),缩小编译时的依赖范围,减少重复编译的时间。