第一章:VS配置Go环境避坑清单总览
Visual Studio(非 VS Code)本身不原生支持 Go 语言开发,但开发者常误以为安装“Visual Studio Tools for Go”或启用 C++/Python 工作负载即可直接编译运行 Go 项目。实际需明确:VS 官方从未提供 Go 语言支持插件,所谓“VS 配置 Go 环境”本质是混淆了 Visual Studio 与 Visual Studio Code —— 后者才是 Go 社区广泛采用的 IDE。
正确工具链定位
务必确认使用的是 Visual Studio Code(简称 VS Code),而非 Visual Studio(IDE 版本如 VS 2022)。二者产品定位、扩展机制与底层架构完全不同。若已安装 Visual Studio,请勿尝试通过扩展市场搜索 “Go” 插件——该市场中无有效 Go 支持项。
Go SDK 安装与 PATH 校验
下载官方二进制包(推荐 https://go.dev/dl/),解压至 C:\Go(避免含空格或中文路径)。执行以下命令验证环境变量是否生效:
# 在 PowerShell 中运行
$env:GOROOT = "C:\Go"
$env:GOPATH = "$env:USERPROFILE\go"
$env:PATH += ";$env:GOROOT\bin;$env:GOPATH\bin"
go version # 应输出类似 go version go1.22.4 windows/amd64
⚠️ 常见错误:仅修改系统环境变量但未在当前终端重启会话,导致 go 命令不可用。
VS Code 扩展与工作区配置
安装官方推荐扩展:
- Go(由 Go Team 维护,ID: golang.go)
- Delve Debugger(自动随 Go 扩展安装)
首次打开 .go 文件时,VS Code 将提示安装依赖工具(如 gopls, dlv, goimports)。必须点击“Install All”,不可跳过。若手动安装,运行:
go install golang.org/x/tools/gopls@latest
go install github.com/go-delve/delve/cmd/dlv@latest
关键配置检查表
| 项目 | 推荐值 | 错误示例 |
|---|---|---|
go.gopath |
留空(自动读取 GOPATH 环境变量) |
手动设为 C:\Users\Name\go\src(路径冗余) |
go.toolsGopath |
保持默认 | 指向非 GOPATH\bin 目录导致 dlv 启动失败 |
editor.formatOnSave |
true |
关闭后 gofmt 不生效,代码风格混乱 |
务必禁用任何第三方 Go 插件(如旧版 Go Extension Pack),仅保留官方 golang.go,避免工具链冲突。
第二章:Go安装与基础环境配置常见错误
2.1 Go二进制包下载校验失败(exit status 127 / permission denied)及PATH修复命令
该错误通常源于两个根本原因:go 命令未被系统识别(exit status 127),或下载的二进制文件无执行权限(permission denied)。
常见故障链
- 下载的
go1.22.5.linux-amd64.tar.gz解压后未设+x权限 /usr/local/go/bin未加入PATH环境变量~/.bashrc与~/.profile加载顺序冲突
快速修复命令
# 解压并赋予执行权限(关键!)
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
sudo chmod -R +x /usr/local/go/bin/
# 永久注入PATH(推荐写入 ~/.profile)
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile
chmod -R +x确保go,gofmt等二进制可执行;source ~/.profile避免新开终端才生效。
验证路径有效性
| 检查项 | 命令 | 预期输出 |
|---|---|---|
| 是否在PATH中 | echo $PATH |
包含 /usr/local/go/bin |
| 是否可执行 | which go |
/usr/local/go/bin/go |
| 版本是否就绪 | go version |
go version go1.22.5 linux/amd64 |
graph TD
A[下载tar.gz] --> B[解压到/usr/local]
B --> C[chmod +x /usr/local/go/bin/*]
C --> D[export PATH=.../go/bin]
D --> E[go version ✅]
2.2 Windows下msi安装器静默失败与注册表残留清理实战
MSI静默安装(msiexec /i package.msi /qn)常因权限不足、依赖缺失或自定义操作(CustomAction)异常而“静默失败”——无报错却未完成部署。
常见静默失败诊断方法
- 检查Windows事件查看器 → 应用程序日志中
MsiInstaller源事件 - 启用详细日志:
msiexec /i app.msi /qn /l*v install.log - 验证返回码:
%ERRORLEVEL%非0即失败(如1603=通用安装错误)
注册表残留定位与清理
MSI卸载信息存储于:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
对应项含 DisplayName、UninstallString 和 ProductCode(GUID格式)。
安全清理脚本(PowerShell)
# 根据产品名模糊匹配并删除注册表项(需管理员权限)
$ProductName = "MyApp"
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", `
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" |
Where-Object { $_.GetValue('DisplayName') -like "*$ProductName*" } |
ForEach-Object { Remove-Item $_.PsPath -Recurse -Force }
逻辑说明:脚本遍历32/64位Uninstall根键,通过
DisplayName筛选目标项,调用Remove-Item -Recurse彻底清除。-Force跳过确认,适用于自动化场景;执行前建议先导出备份(reg export)。
| 清理风险等级 | 触发条件 | 建议操作 |
|---|---|---|
| ⚠️ 中 | UninstallString为空 |
手动验证再删除 |
| ❗ 高 | 多产品共用同一ProductCode | 使用msiexec /x {GUID} /qn卸载优先 |
graph TD
A[msiexec /i /qn] --> B{安装是否完成?}
B -->|否| C[检查ERRORLEVEL & install.log]
B -->|是| D[验证服务/文件/注册表]
C --> E[定位CustomAction或权限问题]
D --> F[发现残留?]
F -->|是| G[按ProductCode清理注册表+Program Files]
2.3 macOS Homebrew install go 版本冲突与多版本共存隔离方案
Homebrew 默认仅维护一个 go 公式,brew install go 始终覆盖 /usr/local/bin/go,导致版本升级即丢失旧版。
多版本管理核心思路
- 避免直接
brew install go;改用brew install go@1.21等带版本后缀的公式(需先brew tap homebrew/versions) - 手动软链控制激活版本:
# 安装多个版本(需提前启用对应 tap)
brew install go@1.21 go@1.22
# 创建版本目录并软链
sudo ln -sf /opt/homebrew/opt/go@1.21/bin/go /usr/local/bin/go-1.21
sudo ln -sf /opt/homebrew/opt/go@1.22/bin/go /usr/local/bin/go-1.22
# 切换默认 go(需 sudo)
sudo ln -sf /usr/local/bin/go-1.22 /usr/local/bin/go
上述命令中,
/opt/homebrew/opt/...是 Apple Silicon 路径(Intel 为/usr/local/opt/...);ln -sf强制覆盖软链接,确保go version输出与软链目标一致。
推荐工具链对比
| 方案 | 隔离性 | Shell 支持 | Homebrew 兼容 |
|---|---|---|---|
gvm |
✅ 进程级 | ✅(需 source) |
❌(独立安装) |
asdf |
✅ 插件化 | ✅(自动 shim) | ✅(asdf plugin add golang) |
| Homebrew 多公式 | ✅ 文件级 | ⚠️ 需手动管理 PATH |
✅ 原生支持 |
graph TD
A[执行 go] --> B{/usr/local/bin/go 是否存在?}
B -->|是| C[解析软链指向实际二进制]
B -->|否| D[报错 command not found]
C --> E[运行对应版本 go runtime]
2.4 Linux非root用户安装Go至$HOME/go的GOROOT/GOPATH权限链修复
非root用户在$HOME/go安装Go时,常因权限链断裂导致go build失败或模块缓存拒绝写入。
权限链关键节点
$HOME/go目录需属主可读写执行(755)GOROOT=$HOME/go必须由用户完全控制GOPATH=$HOME/go-workspace需独立于GOROOT
修复步骤
# 创建并授权GOROOT
mkdir -p $HOME/go
tar -C $HOME -xzf go1.22.3.linux-amd64.tar.gz
chmod -R u+rwX $HOME/go
chown -R $USER:$USER $HOME/go
此命令确保
$HOME/go及其子目录对当前用户具备完整读写执行权限(u+rwX仅对目录加x),避免go install时因/go/bin不可写而失败。
环境变量配置(~/.bashrc)
| 变量 | 值 | 说明 |
|---|---|---|
GOROOT |
$HOME/go |
Go工具链根路径 |
GOPATH |
$HOME/go-workspace |
工作区(非GOROOT子目录) |
PATH |
$GOROOT/bin:$GOPATH/bin:$PATH |
优先加载本地二进制 |
graph TD
A[非root用户] --> B[解压到$HOME/go]
B --> C{权限检查}
C -->|缺失u+w| D[chmod -R u+rwX $HOME/go]
C -->|属主不符| E[chown -R $USER $HOME/go]
D & E --> F[go env -w GOROOT GOPATH]
2.5 Go 1.21+默认启用GO111MODULE=on导致legacy项目构建中断的兼容性回退策略
Go 1.21 起强制启用模块模式,GOPATH 构建方式失效,传统 src/ 目录结构项目直接报错 no Go files in ...。
临时规避方案
- 设置环境变量:
GO111MODULE=off(仅限纯 GOPATH 项目) - 或显式初始化模块:
go mod init legacy.example && go mod tidy
推荐渐进式迁移路径
| 阶段 | 操作 | 适用场景 |
|---|---|---|
| 1. 兼容层 | go env -w GO111MODULE=auto |
混合目录(含 vendor + GOPATH) |
| 2. 过渡期 | go mod vendor + go build -mod=vendor |
离线构建/CI 稳定性保障 |
| 3. 终态 | 移除 vendor/,依赖 go.sum 校验 |
符合 Go 官方推荐实践 |
# 在 legacy 项目根目录执行(含 .go 文件但无 go.mod)
go mod init example.com/legacy # 自动生成最小 go.mod
go mod edit -replace github.com/old/lib=../local-fork # 本地路径替换
go build -o legacy-bin .
该命令重建模块元数据并支持路径重写;-replace 参数允许在不发布新版本前提下热修复依赖,避免 go get 网络拉取失败。
graph TD
A[Legacy GOPATH 项目] --> B{GO111MODULE=on?}
B -->|是| C[构建失败:no module found]
B -->|否| D[降级为 GOPATH 模式]
C --> E[go mod init + vendor]
E --> F[稳定构建]
第三章:VS Code核心插件与语言服务异常诊断
3.1 gopls进程崩溃(“failed to load view” / “context canceled”)的缓存重置与版本对齐操作
当 gopls 报出 failed to load view 或 context canceled,往往源于模块缓存损坏或 Go SDK 版本与 gopls 不兼容。
核心诊断步骤
- 检查
go version与gopls version是否匹配(推荐使用go install golang.org/x/tools/gopls@latest) - 清理
gopls缓存目录:rm -rf $(go env GOCACHE)/gopls-*
重置缓存并强制重建视图
# 1. 停止所有 gopls 实例
killall gopls 2>/dev/null
# 2. 清理模块缓存与 gopls 工作区缓存
go clean -cache -modcache
rm -rf "$(go env GOCACHE)/gopls"
# 3. 重新启动(带调试日志)
gopls -rpc.trace -v serve
此命令组合强制刷新模块元数据、清除 stale view state,并启用 RPC 跟踪以定位上下文取消源头。
-rpc.trace输出可揭示是客户端超时(如 VS Code 配置gopls.timeout过短)还是服务端加载阻塞。
版本对齐建议
| 组件 | 推荐方式 |
|---|---|
| Go SDK | ≥ 1.21(gopls v0.14+ 强制要求) |
| gopls | go install golang.org/x/tools/gopls@latest |
| go.mod | 运行 go mod tidy 确保无 indirect 冲突 |
graph TD
A[触发崩溃] --> B{检查 go/gopls 版本}
B -->|不匹配| C[升级并重装 gopls]
B -->|匹配| D[清理 GOCACHE/gopls/ modcache]
D --> E[重启 gopls + -rpc.trace]
E --> F[分析 trace 中 cancel source]
3.2 Go extension v0.38+与旧版golang.org/x/tools不兼容引发的诊断延迟修复
根本原因定位
Go extension v0.38+ 默认启用 gopls 的 v0.14+ 版本,彻底弃用 golang.org/x/tools/go/analysis v0.12 以下的诊断注册接口。旧版 analysistest.Run 调用链在新 gopls 中被静默忽略,导致 go:build 错误、未使用的导入等诊断延迟 3–5 秒才上报。
兼容性差异对比
| 维度 | 旧版( | v0.38+ |
|---|---|---|
| 分析器注册方式 | Analyzer.Run 直接注入 |
必须通过 gopls 插件 API 注册 |
| 诊断触发时机 | 文件保存即触发 | 依赖 view.Load 完成后批量调度 |
go.mod 变更响应 |
同步重载 | 异步 debounced(默认 2s) |
修复关键代码
// go.work 或 workspace settings.json 中强制对齐版本
{
"gopls": {
"build.experimentalWorkspaceModule": true,
"diagnosticsDelay": "0s" // ⚠️ 禁用延迟,但需配合 module-aware 模式
}
}
该配置绕过 gopls 内部 debounce 机制;diagnosticsDelay: "0s" 参数仅在 experimentalWorkspaceModule: true 下生效,否则被忽略。
诊断流重构示意
graph TD
A[用户保存 .go 文件] --> B{gopls v0.14+}
B --> C[解析 AST + 类型检查]
C --> D[触发 module-aware analysis]
D --> E[即时推送 diagnostics]
3.3 WSL2环境下gopls无法访问Windows GOPATH路径的符号链接映射与devcontainer适配
WSL2默认通过/mnt/c/挂载Windows磁盘,但gopls在Linux命名空间中无法解析Windows端创建的符号链接(如GOPATH/src/github.com/...指向C:\Users\...\go\src\...),因其跨越了NTFS与9P文件系统边界。
根本原因分析
- WSL2内核不支持跨WSL/Windows的symlink透明解析;
gopls严格依赖os.Readlink和filepath.EvalSymlinks,而/mnt/c/下符号链接被视作普通文件。
解决方案对比
| 方案 | 可行性 | devcontainer兼容性 | 备注 |
|---|---|---|---|
wsl --mount + ext4卷 |
✅ 高 | ⚠️ 需手动配置mounts |
避开/mnt/c,完全Linux路径 |
\\wsl$\网络路径映射 |
❌ 无效 | ❌ 不被gopls识别 | 仅限Windows Explorer访问 |
ln -s /home/user/go /work/go |
✅ 推荐 | ✅ 原生支持 | 将GOPATH重定向至WSL原生路径 |
推荐devcontainer配置片段
{
"customizations": {
"vscode": {
"settings": {
"gopls": {
"build.experimentalWorkspaceModule": true,
"directoryFilters": ["-C:/", "-/mnt/c/"]
}
}
}
},
"mounts": [ "source=/home/user/go,target=/work/go,type=none,bind" ]
}
该配置禁用Windows路径扫描,并通过bind mount将WSL原生/home/user/go暴露为/work/go,使gopls在统一Linux路径空间中完成模块解析与符号跳转。
第四章:工作区配置与构建调试链路故障排查
4.1 .vscode/settings.json中go.toolsGopath被弃用后go.toolsEnvVars的等效迁移命令
Go 1.18+ 版本起,go.toolsGopath 已被彻底移除,VS Code Go 扩展要求通过 go.toolsEnvVars 显式注入环境变量。
迁移核心逻辑
旧配置直接覆盖 GOPATH,新方式需将 GOPATH 注入工具进程环境:
{
"go.toolsEnvVars": {
"GOPATH": "${workspaceFolder}/.gopath"
}
}
✅
${workspaceFolder}支持路径变量展开;⚠️go.toolsEnvVars不影响终端或调试器,仅作用于gopls、goimports等 LSP 工具进程。
关键差异对比
| 项目 | go.toolsGopath |
go.toolsEnvVars |
|---|---|---|
| 作用范围 | 全局 GOPATH 覆盖 | 单工具进程环境变量 |
| 动态性 | 静态路径 | 支持变量插值(如 ${env:HOME}) |
推荐实践
- 优先使用模块化工作流,避免显式设置 GOPATH;
- 若必须兼容旧项目,配合
"go.gopath"(仅读取,不生效于工具链)作文档提示。
4.2 launch.json中dlv-dap调试器启动失败(“could not launch process: fork/exec … no such file or directory”)的二进制补全与架构验证
该错误本质是 VS Code 调试器尝试执行 dlv-dap 二进制时,系统无法定位或加载可执行文件。
常见根因分类
dlv-dap未安装或未加入$PATH- 安装的
dlv-dap架构与当前系统不匹配(如 Apple Silicon 上运行 x86_64 二进制) launch.json中dlvPath指向了不存在路径
验证与修复步骤
# 检查 dlv-dap 是否存在且可执行
which dlv-dap
file $(which dlv-dap) # 输出含 "arm64" 或 "x86_64"
file命令揭示二进制目标架构;若输出cannot open '...',说明路径无效;若架构不匹配(如 M1 Mac 显示x86_64),需重装 ARM64 版本。
| 检查项 | 正确示例 | 错误信号 |
|---|---|---|
| 可执行性 | /opt/homebrew/bin/dlv-dap |
which: no dlv-dap in (...) |
| 架构兼容性 | Mach-O 64-bit executable arm64 |
x86_64 on Apple Silicon |
graph TD
A[launch.json 触发调试] --> B{dlv-dap 路径是否有效?}
B -->|否| C[报 “no such file or directory”]
B -->|是| D{架构是否匹配 OS?}
D -->|否| C
D -->|是| E[正常启动]
4.3 test -run正则匹配失效(“no test files matching pattern”)与go.testFlags配置优先级覆盖实操
当执行 go test -run "TestLogin.*" 却报错 no test files matching pattern,问题常源于 go.testFlags 在 VS Code 的 settings.json 中被静态覆盖:
{
"go.testFlags": ["-run=^TestRegister$"]
}
此配置会强制覆盖命令行传入的
-run参数,导致 CLI 指定的正则TestLogin.*被静默丢弃,仅保留硬编码的^TestRegister$。
优先级真相:VS Code 配置 > 命令行参数
Go 插件将 go.testFlags 视为权威输入源,所有 CLI 标志均被合并而非覆盖——除非显式禁用:
| 场景 | 行为 | 推荐修复 |
|---|---|---|
go.testFlags 含 -run |
CLI -run 被忽略 |
删除该字段,改用 go.testEnvVars 动态控制 |
空 go.testFlags |
CLI 参数完全生效 | ✅ 安全默认 |
修复路径(三步)
- 清空
go.testFlags中所有-run相关项 - 使用终端直接运行:
go test -run 'TestLogin.*' ./auth/... - 如需 IDE 集成,改用
go.testEnvVars: { "GO_TEST_RUN": "TestLogin.*" }+ 自定义脚本解析
graph TD
A[用户执行 go test -run 'TestLogin.*'] --> B{go.testFlags 是否含 -run?}
B -->|是| C[CLI -run 被丢弃]
B -->|否| D[正则正常生效]
C --> E[报 no test files matching pattern]
4.4 Remote-SSH连接后go.mod依赖解析卡死的代理隧道配置与GOPROXY bypass规则注入
当 VS Code Remote-SSH 连接到内网开发机时,go mod tidy 常因网络策略卡在 proxy.golang.org 或私有模块拉取阶段——根本原因在于 SSH 隧道未透传 GOPROXY 环境变量,且默认代理链未绕过企业内网 registry。
核心问题定位
- Remote-SSH 启动的 shell 不继承本地
GOPROXY/GONOPROXY - 内网 Go 模块仓库(如
gitlab.internal.corp/go)被全局代理拦截 go命令在远程执行时 fallback 到直连,触发超时重试
解决方案:动态注入 bypass 规则
# 在远程 ~/.bashrc 中追加(需重载或重启 VS Code 窗口)
export GOPROXY="https://goproxy.cn,direct"
export GONOPROXY="gitlab.internal.corp,github.enterprise.com"
export GOPRIVATE="gitlab.internal.corp,github.enterprise.com"
此配置强制
go工具对匹配域名跳过代理直连;direct作为兜底策略避免私有模块解析失败。注意GONOPROXY与GOPRIVATE需保持一致,否则go mod download仍会尝试代理。
代理隧道增强配置(VS Code settings.json)
| 字段 | 值 | 说明 |
|---|---|---|
remote.SSH.enableAgentForwarding |
true |
复用本地 SSH agent 访问内网 Git |
go.toolsEnvVars |
{ "GOPROXY": "https://goproxy.cn,direct" } |
VS Code Go 扩展级环境注入 |
graph TD
A[VS Code Local] -->|SSH Tunnel| B[Remote Host]
B --> C{go mod tidy}
C --> D[GOPROXY=goproxy.cn,direct]
C --> E[GONOPROXY=gitlab.internal.corp]
D -->|proxy hit| F[public module]
E -->|bypass| G[internal git server]
第五章:go env输出异常速查表与终局验证
常见异常现象与根因映射
当执行 go env 时出现空值、路径错乱或环境变量缺失,往往并非 Go 安装损坏,而是多层环境叠加干扰所致。典型场景包括:在 Docker 容器中未显式设置 GOROOT 导致 go env GOROOT 输出为空;macOS 上通过 Homebrew 安装 Go 后又手动解压二进制覆盖,造成 GOCACHE 指向已被删除的 /Users/olduser/Library/Caches/go-build;Windows 用户在 PowerShell 与 CMD 间混用,因 $env:GOPATH 与 %GOPATH% 作用域不一致导致 go env GOPATH 在不同终端输出不一致。
异常速查响应矩阵
| 异常表现 | 可能原因 | 快速验证命令 | 推荐修复动作 |
|---|---|---|---|
GOOS="" 或 GOARCH="" |
GOOS/GOARCH 被设为空字符串(如 export GOOS=) |
printenv \| grep -E '^(GOOS\|GOARCH)$' |
unset GOOS GOARCH 或修正为合法值(darwin, linux, amd64, arm64) |
GOROOT="/usr/local/go" 但 go version 报错 command not found |
PATH 中 GOROOT/bin 未加入,或存在同名别名覆盖 |
which go + ls -l $(which go) |
export PATH="$GOROOT/bin:$PATH" 并写入 shell 配置文件 |
GOMOD="" 即使在模块项目根目录下 |
当前工作目录无 go.mod,或 .git 目录被误删导致 go list -m 失效 |
ls -A \| grep go.mod + git status --porcelain |
go mod init <module-name> 或恢复 .git 元数据 |
终局验证流程图
flowchart TD
A[执行 go env] --> B{GOROOT 是否指向有效安装路径?}
B -->|否| C[定位真实 Go 安装位置:find /usr -name 'go' -type d 2>/dev/null \| head -1]
B -->|是| D{GOPATH/bin 是否在 PATH 中?}
D -->|否| E[追加 export PATH=\"$GOPATH/bin:$PATH\" 到 ~/.zshrc]
D -->|是| F[运行 go build -o /tmp/hello . && /tmp/hello]
C --> G[重设 GOROOT 并重载环境]
G --> D
E --> D
F --> H{执行成功且输出预期结果?}
H -->|是| I[验证通过]
H -->|否| J[检查 CGO_ENABLED、Go 版本兼容性及系统头文件]
实战案例:CI 环境中的静默失效
某 GitHub Actions 工作流使用 actions/setup-go@v4 设置 Go 1.22,但后续步骤中 go env GOCACHE 返回 /home/runner/.cache/go-build,而实际构建失败提示 permission denied。排查发现 runner 使用非 root 用户启动容器,但缓存目录由 root 创建且权限为 drwx------。终局验证时执行:
# 手动模拟构建上下文
mkdir -p /home/runner/.cache/go-build
chmod 755 /home/runner/.cache/go-build
go env -w GOCACHE=/home/runner/.cache/go-build
go build -gcflags="all=-l" -o /tmp/test main.go
ls -l /tmp/test && file /tmp/test
验证输出显示 ELF 文件架构为 x86_64 且无符号表,确认交叉编译链与缓存策略协同生效。
不可忽略的 Shell 初始化陷阱
Zsh 用户若在 ~/.zprofile 中设置 export GOPATH=$HOME/go,却在 ~/.zshrc 中重复执行 go env -w GOPATH=$HOME/go,将触发 go env 写入 GOENV 文件(默认 $HOME/.go/env),导致后续 go env -u GOPATH 无法清除该值。终局验证需组合执行:
go env -u GOPATH
unset GOPATH
go env GOPATH # 应返回 $HOME/go(默认值)
rm -f $HOME/.go/env
此时再次 go env 将完全依赖 shell 环境变量,排除 Go 工具链自身配置污染。
