运行
go env会输出几十项环境变量,它们控制着 Go 的编译、链接、模块、缓存等方方面面。这篇笔记按使用频率分类,逐一梳理每个变量的含义和常见用法。
一、快速上手:go env 命令用法
1 | |
⚠️
go env -w写入的值会持久化到%APPDATA%\go\env(Windows)或~/.config/go/env(Linux/macOS),不会因为关闭终端而丢失。
二、变量速查表
| 分类 | 变量 | 一句话说明 |
|---|---|---|
| 目标平台 | GOOS GOARCH | 编译产物跑在什么系统和 CPU 上 |
| 路径 | GOROOT GOPATH GOBIN | Go 安装目录 / 工作目录 / 可执行文件安装位置 |
| 缓存 | GOCACHE GOMODCACHE | 编译缓存 / 模块下载缓存 |
| 模块 | GO111MODULE GOPROXY | 模块开关 / 模块代理 |
| 私有 | GOPRIVATE GONOPROXY GONOSUMDB | 不走代理和不校验的私有仓库前缀 |
| 校验 | GOSUMDB GOINSECURE | 校验和数据库 / 允许 HTTP 下载的模块 |
| CGO | CGO_ENABLED CC CXX | C 互操作开关和编译器路径 |
| 工具链 | GOTOOLCHAIN GOVERSION | 工具链选择策略 / 当前版本 |
| 调试 | GODEBUG GOTELEMETRY | 运行时调试 / 遥测开关 |
| 格式 | GOEXE GOAMD64 | 可执行文件后缀 / amd64 指令集级别 |
三、常用变量(开发中经常修改)
GOOS / GOARCH — 目标操作系统和架构
交叉编译的核心变量,控制编译产物跑在哪里:
| GOOS | 说明 | GOARCH | 说明 |
|---|---|---|---|
linux | Linux | amd64 | x86_64 |
windows | Windows | 386 | x86 32位 |
darwin | macOS | arm64 | ARM 64位 |
freebsd | FreeBSD | riscv64 | RISC-V 64位 |
1 | |
GOPROXY — 模块代理
Go 模块下载的代理地址,国内开发必配:
1 | |
| 代理 | 说明 |
|---|---|
https://goproxy.cn | 国内七牛云代理,速度快 |
https://proxy.golang.org | 官方代理(国内可能慢) |
direct | 代理找不到时直接从源码仓库拉取 |
1 | |
GOSUMDB — 校验和数据库
验证模块完整性的校验和数据库:
| 值 | 说明 |
|---|---|
sum.golang.org | 公共数据库(默认) |
sum.golang.google.cn | 国内可访问的镜像 |
off | 关闭校验(不推荐) |
1 | |
CGO_ENABLED — CGO 开关
| 值 | 说明 |
|---|---|
1 | 启用 CGO,允许调用 C 代码 |
0 | 禁用 CGO,纯 Go 编译 |
⚠️ 交叉编译时通常需要
CGO_ENABLED=0,但依赖 CGO 的包(如go-sqlite3)无法编译。
GOPRIVATE — 私有模块总开关
同时设置 GONOPROXY 和 GONOSUMDB 的快捷方式:
1 | |
等价于:
1 | |
有私有仓库时必须配置,避免走代理返回 404。
GOBIN — 可执行文件安装位置
go install 安装的工具存放路径,为空时默认使用 $GOPATH/bin:
1 | |
GOCACHE — 编译缓存
编译中间产物的缓存目录,复用可大幅提速:
1 | |
1 | |
GODEBUG — 运行时调试
控制 Go 运行时行为的调试标志:
1 | |
四、不常用变量(偶尔需要修改)
GO111MODULE — 模块开关
| 值 | 说明 |
|---|---|
on | 始终使用模块模式(Go 1.16+ 默认) |
off | 使用 GOPATH 模式 |
auto | 在 go.mod 存在时自动启用 |
现代项目保持默认即可。
GOPATH — Go 工作目录
1 | |
包含三个子目录:
| 子目录 | 用途 |
|---|---|
src/ | 源码(模块模式下较少用) |
pkg/ | 编译后的包对象 |
bin/ | go install 安装的可执行文件 |
⚠️ 即使模块模式下,
GOPATH/bin仍然存放go install下载的工具。
GOMODCACHE — 模块下载缓存
1 | |
依赖包下载后的缓存位置。清理用 go clean -modcache,磁盘不足时可考虑清理。
GONOPROXY / GONOSUMDB — 私有模块细粒度控制
GONOPROXY— 不走代理的模块,直连源码仓库GONOSUMDB— 不校验校验和的模块,跳过公共数据库检查
一般直接设 GOPRIVATE 就行,两者会被自动同步。
GOINSECURE — 允许 HTTP 下载
留空即可。除非有内部仓库只支持 HTTP 才需要设。
GOFLAGS — 默认 go 命令参数
每次执行 go 命令时自动附加的参数,一般留空。
CC / CXX / AR — C 工具链路径
| 变量 | 用途 |
|---|---|
CC | C 编译器 |
CXX | C++ 编译器 |
AR | 归档工具(生成 .a 静态库) |
交叉编译时可指向对应工具链:
1 | |
CGO_CFLAGS / CGO_LDFLAGS 等 — C 编译参数
| 变量 | 用途 |
|---|---|
CGO_CFLAGS | C 编译器标志 |
CGO_CPPFLAGS | C 预处理器标志 |
CGO_CXXFLAGS | C++ 编译器标志 |
CGO_LDFLAGS | 链接器标志 |
CGO_FFLAGS | Fortran 编译器标志 |
GOTOOLCHAIN — 工具链选择策略(Go 1.21+)
| 值 | 说明 |
|---|---|
auto | 根据 go.mod 的 toolchain 自动选择(默认) |
local | 始终使用本地安装的工具链 |
go1.xx.x | 强制使用指定版本 |
1 | |
GOAMD64 — amd64 指令集级别
| 值 | 说明 |
|---|---|
v1 | 基础 x86-64(默认,兼容性最好) |
v2 | SSE4.2 + POPCNT + AES |
v3 | AVX2 + FMA + BMI2 |
v4 | AVX512 |
更高级别性能更好,但老 CPU 可能无法运行编译出的二进制文件。
GOVCS — 版本控制系统控制
控制 go get 允许使用的 VCS 类型,一般留空。
GOTELEMETRY — 遥测开关
Go 1.22+ 引入的匿名工具链使用数据收集:
| 值 | 说明 |
|---|---|
local | 仅本地存储,不上报(默认) |
on | 允许上报 |
off | 完全关闭 |
GOTELEMETRYDIR — 遥测数据存储路径
GOTELEMETRY=local 时的本地存储目录。
GOAUTH — 认证方式
| 值 | 说明 |
|---|---|
netrc | 使用 .netrc 文件中的凭据(默认) |
off | 不进行认证 |
GOFIPS140 — FIPS 140 加密合规
| 值 | 说明 |
|---|---|
off | 关闭(默认) |
on | 强制使用 FIPS 认证的加密实现 |
auto | 如果工具链支持则启用 |
GOWORK — go.work 工作区文件路径
Go Workspace 模式下的工作区文件路径,为空表示未启用。
GOEXPERIMENT — 实验性功能
启用未发布的语言特性,通常留空。
五、只读变量(仅查看,无需修改)
GOVERSION — Go 版本
当前工具链的版本号,如 go1.26.1。
GOROOT — Go 安装目录
标准库和工具的根目录,由安装程序自动设置。
GOHOSTOS / GOHOSTARCH — 宿主机平台
Go 工具链自身运行的平台,由编译 Go 时决定,不需要修改。
GOTOOLDIR — Go 内部工具目录
编译器、链接器等内部工具的存放路径。
GOMOD — go.mod 文件路径
当前模块的 go.mod 绝对路径。无 go.mod 时为 /dev/null。
GOEXE — 可执行文件后缀
Windows 上为 .exe,Linux/macOS 上为空字符串。
GOENV — 环境配置文件路径
go env -w 写入的配置文件位置。Windows:%APPDATA%\go\env,Linux/macOS:~/.config/go/env。
GOGCCFLAGS — GCC 标志
Go 内部调用 GCC 时使用的标志,不需要手动修改。
GOTMPDIR / GOCACHEPROG / PKG_CONFIG
这三个变量一般留空:
GOTMPDIR— Go 编译临时目录,空则用系统默认GOCACHEPROG— 外部缓存代理程序,用于分布式编译缓存PKG_CONFIG— CGO 编译时查找 C 库的pkg-config路径
六、常见问题
如何恢复某个变量的默认值?
1 | |
交叉编译报 CGO 错误怎么办?
交叉编译时 CGO 会尝试调用宿主机的 C 编译器,大概率失败。禁用 CGO:
1 | |
如何查看某个变量的值?
1 | |
go env -w 设置的值存在哪里?
在 $GOENV 文件中:Windows 是 %APPDATA%\go\env,Linux/macOS 是 ~/.config/go/env。可以直接编辑。