💡 完整清单用 go tool vet help 查看(1.27.1 共注册 36 个 analyzer)。⚠️ go vet 抓不到 nil 接口陷阱——它没有这个检查项,那类问题只能靠 08 里讲的规则与代码审查(或 staticcheck)。
环境变量
flowchart LR
subgraph BUILD["影响构建"]
B1["GOOS / GOARCH<br/>目标平台"]
B2["CGO_ENABLED<br/>0=纯静态"]
B3["GOFLAGS<br/>默认命令行参数"]
B4["GOTOOLCHAIN<br/>工具链切换"]
end
subgraph CACHE["影响缓存"]
C1["GOCACHE<br/>编译缓存"]
C2["GOMODCACHE<br/>依赖缓存"]
C3["GOPATH<br/>旧时代根目录"]
end
subgraph NET["影响网络"]
N1["GOPROXY<br/>模块代理"]
N2["GOSUMDB=off<br/>或 GOPRIVATE / GONOSUMDB<br/>跳过校验 ⚠️"]
N3["GOFLAGS=-mod=vendor<br/>强制走 vendor"]
end
subgraph RUNTIME["影响运行"]
R1["GOMAXPROCS<br/>P 的数量"]
R2["GOGC / GOMEMLIMIT<br/>GC 行为"]
R3["GODEBUG<br/>运行时开关"]
end
变量
典型值
记忆点
GOOS / GOARCH
linux / arm64
交叉编译只需这两个 🔥
CGO_ENABLED
0
置 0 才能得到真正静态链接的二进制
GOPROXY
https://goproxy.cn,direct
国内加速;别丢掉末尾 direct
GOSUMDB
sum.golang.org
校验模块哈希,企业内网可设 off ⚠️
GOTOOLCHAIN
auto(默认)/ local / go1.27.1
auto 会按 go.mod 自动下载所需工具链 🆕 1.21
GOFLAGS
-trimpath
全局附加参数,CI 里常用
GOCACHE
~/Library/Caches/go-build
体积会涨到 GB 级,go clean -cache 回收
GOMODCACHE
~/go/pkg/mod
依赖源码实际落盘处
GOMAXPROCS
默认等于 CPU 核数
Go 1.25 起容器内会感知 cgroup 配额 🆕
GOGC / GOMEMLIMIT
100 / 512MiB
内存换 CPU 的两个旋钮
查看与写入(区分大小写,写入后持久化到 go env 配置文件):
1
2
3
4
5
6
7
$ go env GOPROXY GOMODCACHE
https://goproxy.cn,direct
/Users/lx/go/pkg/mod
$ go env -w GOPROXY=https://goproxy.cn,direct # 持久写入$ go env -u GOPROXY # 撤销,回到默认$ go env -w GOFLAGS=-trimpath
⚠️ go env -w 写的是用户级配置,优先级高于系统默认但低于进程环境变量。CI 里建议直接用环境变量注入,不要改机器状态。
从零到交付
flowchart LR
A["mkdir demo<br/>cd demo"] --> B["go mod init<br/>example.com/demo"]
B --> C["写 main.go<br/>package main + func main"]
C --> D["go mod tidy<br/>补齐依赖"]
D --> E["gofmt + go vet<br/>格式化与静态检查"]
E --> F["go test ./...<br/>跑测试"]
F --> G["go build<br/>-ldflags 注入版本"]
G --> H["交叉编译<br/>GOOS/GOARCH"]
H --> I["交付单个二进制"]
$GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o api-linux-amd64 .
$GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o api-linux-arm64 .
$GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o api.exe .
$GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -o api-mac-arm64 .
$ file api-linux-arm64
api-linux-arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, ...
GOOS
GOARCH
典型目标
linux
amd64 / arm64
服务器、容器 🔥
darwin
arm64 / amd64
Apple Silicon / Intel Mac
windows
amd64
Windows
js
wasm
浏览器 WebAssembly 🚧
wasip1
wasm
WASI 运行时 🆕 1.21 🚧
CGO_ENABLED=0 的意义:一旦启用 cgo,产物就依赖目标平台的 C 库,交叉编译需要对应交叉工具链,且不再是静态二进制。所以「单文件部署」的前提是不引入 cgo。
1
2
$ go tool dist list | wc -l # 支持的平台组合总数$ go tool dist list | grep linux # 只看 linux
构建标记与版本注入
编译期注入版本信息
这是生产二进制最该有的一段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
packagemainimport("fmt""runtime")// 这三个变量由 -ldflags 在链接期覆盖,默认值只在 go run 时出现var(version="dev"commit="none"date="unknown")funcmain(){fmt.Printf("version=%s commit=%s date=%s go=%s\n",version,commit,date,runtime.Version())}