通过编译器选项减少编译时间和二进制文件大小:
-c
:仅编译不链接,适合需要多次编译的场景(如测试单个包);-s
:去除调试符号(如文件名、行号),减小编译后文件大小;-p
:设置并行编译的goroutine数量(默认为CPU核心数,如-p 4
可手动调整);-ldflags="-w -s"
:去除DWARF调试信息和符号表,进一步减小编译后文件(如将2MB的二进制文件减至1.5MB)。Go 1.10+内置构建缓存,合理配置可避免重复编译:
go env GOCACHE
查看缓存目录(通常为~/.cache/go-build
);export GOCACHE=/mnt/ssd/go-cache
),提升读写速度;GOCACHE
和GOMODCACHE
(~/go/pkg/mod
),避免每次构建重新下载依赖。减少编译范围和时间:
utils
包)拆分为多个小包(如utils/string
、utils/file
),缩小编译单元;go mod vendor
:将依赖项复制到项目vendor
目录,避免每次编译都从远程仓库下载依赖(适合离线或网络不稳定环境)。提升硬件性能直接加快编译速度:
减少依赖带来的编译开销:
go.mod
中的require
指令固定依赖版本(如github.com/gin-gonic/gin v1.9.1
),避免go get -u
自动升级导致缓存失效;go mod tidy
移除未使用的依赖,减少编译时的处理量;gomodproxy
(国内可使用https://goproxy.cn
),加速依赖下载(但需注意缓存依赖以减少重复下载)。在自动化流程中提升编译效率:
GOCACHE
和GOMODCACHE
,例如:- uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}-${{ matrix.go-version }}
go mod download
),第二阶段复制源代码并编译,利用Docker层缓存避免重复下载依赖。