运行 go env 会输出几十项环境变量,它们控制着 Go 的编译、链接、模块、缓存等方方面面。这篇笔记按使用频率分类,逐一梳理每个变量的含义和常见用法。


一、快速上手:go env 命令用法

1
2
3
4
5
6
7
8
9
10
11
# 查看全部
go env

# 查看单个变量
go env GOPATH

# 设置变量(写入配置文件,永久生效)
go env -w GOPROXY=https://goproxy.cn,direct

# 恢复默认值
go env -u GOPROXY

⚠️ go env -w 写入的值会持久化到 %APPDATA%\go\env(Windows)或 ~/.config/go/env(Linux/macOS),不会因为关闭终端而丢失。


二、变量速查表

分类变量一句话说明
目标平台GOOS GOARCH编译产物跑在什么系统和 CPU 上
路径GOROOT GOPATH GOBINGo 安装目录 / 工作目录 / 可执行文件安装位置
缓存GOCACHE GOMODCACHE编译缓存 / 模块下载缓存
模块GO111MODULE GOPROXY模块开关 / 模块代理
私有GOPRIVATE GONOPROXY GONOSUMDB不走代理和不校验的私有仓库前缀
校验GOSUMDB GOINSECURE校验和数据库 / 允许 HTTP 下载的模块
CGOCGO_ENABLED CC CXXC 互操作开关和编译器路径
工具链GOTOOLCHAIN GOVERSION工具链选择策略 / 当前版本
调试GODEBUG GOTELEMETRY运行时调试 / 遥测开关
格式GOEXE GOAMD64可执行文件后缀 / amd64 指令集级别

三、常用变量(开发中经常修改)

GOOS / GOARCH — 目标操作系统和架构

交叉编译的核心变量,控制编译产物跑在哪里:

GOOS说明GOARCH说明
linuxLinuxamd64x86_64
windowsWindows386x86 32位
darwinmacOSarm64ARM 64位
freebsdFreeBSDriscv64RISC-V 64位
1
2
3
GOOS=linux  GOARCH=amd64 go build -o app-linux
GOOS=darwin GOARCH=arm64 go build -o app-mac
GOOS=windows GOARCH=amd64 go build -o app.exe

GOPROXY — 模块代理

Go 模块下载的代理地址,国内开发必配:

1
set GOPROXY=https://goproxy.cn,direct
代理说明
https://goproxy.cn国内七牛云代理,速度快
https://proxy.golang.org官方代理(国内可能慢)
direct代理找不到时直接从源码仓库拉取
1
2
# 国内推荐
go env -w GOPROXY=https://goproxy.cn,direct

GOSUMDB — 校验和数据库

验证模块完整性的校验和数据库:

说明
sum.golang.org公共数据库(默认)
sum.golang.google.cn国内可访问的镜像
off关闭校验(不推荐)
1
2
# 国内推荐
go env -w GOSUMDB=sum.golang.google.cn

CGO_ENABLED — CGO 开关

说明
1启用 CGO,允许调用 C 代码
0禁用 CGO,纯 Go 编译

⚠️ 交叉编译时通常需要 CGO_ENABLED=0,但依赖 CGO 的包(如 go-sqlite3)无法编译。

GOPRIVATE — 私有模块总开关

同时设置 GONOPROXYGONOSUMDB 的快捷方式:

1
set GOPRIVATE=gitee.com/feitian2025/*

等价于:

1
2
go env -w GONOPROXY=gitee.com/feitian2025/*
go env -w GONOSUMDB=gitee.com/feitian2025/*

有私有仓库时必须配置,避免走代理返回 404。

GOBIN — 可执行文件安装位置

go install 安装的工具存放路径,为空时默认使用 $GOPATH/bin

1
2
go env -w GOBIN=$HOME/.local/bin    # 自定义安装路径
go env -u GOBIN # 恢复默认

GOCACHE — 编译缓存

编译中间产物的缓存目录,复用可大幅提速:

1
set GOCACHE=C:\Users\Administrator\AppData\Local\go-build
1
2
go clean -cache     # 清理缓存(编译异常时可尝试)
go env GOCACHE # 查看路径

GODEBUG — 运行时调试

控制 Go 运行时行为的调试标志:

1
2
GODEBUG=gctrace=1 go run main.go       # 追踪 GC
GODEBUG=schedtrace=1000 go run main.go # 追踪调度

四、不常用变量(偶尔需要修改)

GO111MODULE — 模块开关

说明
on始终使用模块模式(Go 1.16+ 默认)
off使用 GOPATH 模式
autogo.mod 存在时自动启用

现代项目保持默认即可。

GOPATH — Go 工作目录

1
set GOPATH=C:\Users\Administrator\go

包含三个子目录:

子目录用途
src/源码(模块模式下较少用)
pkg/编译后的包对象
bin/go install 安装的可执行文件

⚠️ 即使模块模式下,GOPATH/bin 仍然存放 go install 下载的工具。

GOMODCACHE — 模块下载缓存

1
set GOMODCACHE=C:\Users\Administrator\go\pkg\mod

依赖包下载后的缓存位置。清理用 go clean -modcache,磁盘不足时可考虑清理。

GONOPROXY / GONOSUMDB — 私有模块细粒度控制

  • GONOPROXY — 不走代理的模块,直连源码仓库
  • GONOSUMDB — 不校验校验和的模块,跳过公共数据库检查

一般直接设 GOPRIVATE 就行,两者会被自动同步。

GOINSECURE — 允许 HTTP 下载

留空即可。除非有内部仓库只支持 HTTP 才需要设。

GOFLAGS — 默认 go 命令参数

每次执行 go 命令时自动附加的参数,一般留空。

CC / CXX / AR — C 工具链路径

变量用途
CCC 编译器
CXXC++ 编译器
AR归档工具(生成 .a 静态库)

交叉编译时可指向对应工具链:

1
go env -w CC=aarch64-linux-gnu-gcc

CGO_CFLAGS / CGO_LDFLAGS 等 — C 编译参数

变量用途
CGO_CFLAGSC 编译器标志
CGO_CPPFLAGSC 预处理器标志
CGO_CXXFLAGSC++ 编译器标志
CGO_LDFLAGS链接器标志
CGO_FFLAGSFortran 编译器标志

GOTOOLCHAIN — 工具链选择策略(Go 1.21+)

说明
auto根据 go.modtoolchain 自动选择(默认)
local始终使用本地安装的工具链
go1.xx.x强制使用指定版本
1
2
go env -w GOTOOLCHAIN=local      # 固定本地版本
go env -w GOTOOLCHAIN=go1.22.0 # 强制指定版本

GOAMD64 — amd64 指令集级别

说明
v1基础 x86-64(默认,兼容性最好)
v2SSE4.2 + POPCNT + AES
v3AVX2 + FMA + BMI2
v4AVX512

更高级别性能更好,但老 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
2
3
go env -u 变量名
# 例如
go env -u GOPROXY

交叉编译报 CGO 错误怎么办?

交叉编译时 CGO 会尝试调用宿主机的 C 编译器,大概率失败。禁用 CGO:

1
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

如何查看某个变量的值?

1
2
3
go env GOPATH
# 或多个
go env GOPATH GOPROXY GOROOT

go env -w 设置的值存在哪里?

$GOENV 文件中:Windows 是 %APPDATA%\go\env,Linux/macOS 是 ~/.config/go/env。可以直接编辑。