构建工具链
go 命令全景
| 命令 | 作用 | 常用程度 |
|---|
go build | 编译包和依赖 | P0 |
go run | 编译并运行 | P0 |
go test | 测试 | P0 |
go fmt | 格式化代码 | P0 |
go vet | 静态检查 | P0 |
go mod | 模块管理 | P0 |
go get | 获取依赖 | P0 |
go install | 编译并安装 | P1 |
go generate | 代码生成 | P1 |
go tool | 运行工具(pprof/trace) | P1 |
go env | 环境变量管理 | P1 |
go clean | 清理缓存 | P1 |
go doc | 查看文档 | P1 |
go list | 列出包信息 | P2 |
go work | workspace 管理 | P2 |
go version | 版本信息 | P2 |
go fix | 自动修复旧 API | P2 |
go cover | 覆盖率工具 | P2 |
go build 详解
# 基本用法
go build ./... # 编译当前模块所有包
go build ./cmd/server # 编译指定包
go build -o bin/server ./cmd/server # 指定输出路径
# 交叉编译(Go 的杀手锏)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/server-linux-amd64 ./cmd/server
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o bin/server-linux-arm64 ./cmd/server
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o bin/server-darwin-arm64 ./cmd/server
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o bin/server-windows-amd64.exe ./cmd/server
GOOS / GOARCH 支持矩阵
| GOOS | GOARCH | 说明 |
|---|
| linux | amd64 | 最常见的服务器目标 |
| linux | arm64 | ARM 服务器(如 AWS Graviton) |
| linux | arm | 树莓派等 |
| darwin | amd64 | Intel Mac |
| darwin | arm64 | Apple Silicon Mac |
| windows | amd64 | Windows |
| windows | arm64 | Windows ARM |
| js | wasm | WebAssembly |
| wasip1 | wasm | WASI(Go 1.21+) |
ldflags 详解
# 注入版本信息(CI/CD 常用)
go build -ldflags "-X main.Version=v1.0.0 -X main.CommitHash=abc123 -X main.BuildTime=2026-01-01" -o server ./cmd/server
# 去除调试信息(减小二进制体积,约减少 30%)
go build -ldflags "-s -w" -o server ./cmd/server
# -s: 去除符号表
# -w: 去除 DWARF 调试信息
# 两者同时使用最常见
# 交叉编译 + 瘦身组合
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X main.Version=v1.0.0" -o server ./cmd/server
| flag | 作用 | 影响 |
|---|
-X importpath.name=value | 设置 string 变量值 | 注入构建信息 |
-s | 去除符号表 | 体积减小,无法用 nm 查看 |
-w | 去除 DWARF | 体积减小,无法用 gdb 调试 |
-trimpath | 去除文件路径前缀 | 隐私保护、可复现构建 |
//go:build linux && amd64
// +build linux,amd64
package config
// 这个文件只在 linux + amd64 时编译
func loadConfig() *Config {
// linux 特有实现
}
//go:build !linux
package config
// 非 linux 环境的实现
func loadConfig() *Config {
// 其他平台实现
}
# 使用自定义 tag
//go:build debug
go build -tags debug ./cmd/server # 编译时启用 debug tag
go test 详解
# 基本测试
go test ./... # 测试所有包
go test -v ./... # 详细输出
go test -run TestUser ./internal/service # 指定测试函数
go test -run TestUser/Create ./... # 子测试匹配
# 竞争检测(开发时必开)
go test -race ./...
# 覆盖率
go test -cover ./... # 显示覆盖率
go test -coverprofile=coverage.out ./... # 生成覆盖率报告
go tool cover -html=coverage.out -o coverage.html # HTML 报告
go tool cover -func=coverage.out # 函数级覆盖率
# 基准测试
go test -bench=. ./... # 运行所有基准测试
go test -bench=BenchmarkUser -benchmem ./... # 含内存分配
go test -bench=. -count=5 ./... # 跑 5 次取平均
go test -bench=. -benchtime=5s ./... # 指定运行时间
# 模糊测试(Go 1.18+)
go test -fuzz=FuzzParse ./internal/parser
go test -fuzz=FuzzParse -fuzztime=30s ./internal/parser
# 短模式(CI 中跳过耗时测试)
go test -short ./...
# 并行控制
go test -p 1 ./... # 串行执行包
go test -parallel 4 ./... # 4 个测试并行
# 超时控制
go test -timeout 30s ./... # 30 秒超时
go generate(代码生成)
//go:generate mockgen -source=user_service.go -destination=mock_user_service.go -package=service
type UserService interface {
GetByID(ctx context.Context, id string) (*User, error)
}
go generate ./... # 执行所有 //go:generate 指令
| 工具 | 用途 | 示例 |
|---|
mockgen | 生成 mock 代码 | mockgen -source=foo.go -destination=mock_foo.go |
stringer | 生成 String() 方法 | stringer -type=Color |
enumer | 生成枚举方法 | enumer -type=Color |
wire | 生成依赖注入代码 | wire ./... |
protoc-gen-go | 生成 gRPC 代码 | protoc --go_out=. *.proto |
golangci-lint 配置
# .golangci.yml
run:
timeout: 5m
go: "1.22"
linters:
enable:
- errcheck # 检查未处理的错误
- gosimple # 简化代码建议
- govet # go vet 检查
- ineffassign # 检查无效赋值
- staticcheck # 综合静态检查
- unused # 检查未使用的代码
- gofmt # 格式检查
- goimports # import 顺序检查
- misspell # 拼写检查
- lll # 行长度限制
- dupl # 重复代码检查
- gocyclo # 圈复杂度检查
- bodyclose # 检查 http.Response.Body.Close()
- gosec # 安全检查
- revive # 替代 golint 的 linter
- gocritic # 代码优化建议
linters-settings:
lll:
line-length: 120
gocyclo:
min-complexity: 15
dupl:
threshold: 100
issues:
exclude-rules:
- path: _test\.go
linters:
- dupl
- gocyclo
- errcheck
环境变量速查
| 变量 | 默认值 | 作用 |
|---|
GOPROXY | https://proxy.golang.org,direct | 模块代理 |
GOSUMDB | sum.golang.org | 依赖校验服务 |
GOPRIVATE | (空) | 私有仓库(不走代理和校验) |
GONOSUMDB | (空) | 不校验的仓库 |
GOOS | 当前系统 | 目标操作系统 |
GOARCH | 当前架构 | 目标 CPU 架构 |
CGO_ENABLED | 1(有 C 编译器时) | 是否启用 CGO |
GOMODCACHE | $GOPATH/pkg/mod | 模块缓存路径 |
GOCACHE | $HOME/.cache/go-build | 构建缓存路径 |
GOFLAGS | (空) | 默认 go 命令参数 |
GOROOT | Go 安装路径 | Go 根目录 |
GOPATH | $HOME/go | 工作空间(Go 1.11 后重要性降低) |
# 批量设置开发环境
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOFLAGS=-mod=mod
go env -w GOMODCACHE=/data/go/modcache
Docker 多阶段构建
# 阶段1:构建
FROM golang:1.22-alpine AS builder
WORKDIR /app
# 利用缓存:先拷贝依赖文件
COPY go.mod go.sum ./
RUN go mod download
# 再拷贝源码
COPY . .
# 编译
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -ldflags="-s -w -X main.Version=${VERSION}" \
-o /app/bin/server ./cmd/server
# 阶段2:运行时(极简镜像)
FROM scratch
COPY --from=builder /app/bin/server /server
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/server"]
| 基础镜像 | 大小 | 适用场景 |
|---|
golang:1.22 | ~850MB | 开发环境(含完整工具链) |
golang:1.22-alpine | ~350MB | 构建阶段(轻量) |
alpine:3.19 | ~5MB | 运行时(需 CGO 时用) |
scratch | 0MB | 运行时(终极精简,需静态编译) |
gcr.io/distroless/static | ~2MB | 运行时(有 CA 证书,更安全) |