彻底卸载 Go 需清除二进制、$GOROOT/$GOPATH 环境变量、模块缓存、shell 初始化脚本中的旧路径及 IDE/终端缓存;不同安装方式(Homebrew/apt等)须用对应卸载命令,否则重装后行为异常。

直接删 go 目录和 $GOROOT 环境变量不够,残留的 go 二进制、$GOPATH 缓存、模块代理配置、shell 初始化脚本里的旧路径,都会导致重装后行为异常。
确认当前 Go 安装来源和路径
很多人重装失败,是因为根本没搞清自己当初怎么装的——是官网下载包、Homebrew、apt、dnf 还是 snap?不同来源卸载方式完全不同。
- 运行
which go查看可执行文件位置,比如/usr/local/go/bin/go或/home/username/sdk/go/bin/go - 运行
go env GOROOT看实际生效的根目录,它可能和which go的上级目录不一致(尤其用gvm或多版本管理时) - 检查
echo $PATH中是否包含多个go相关路径,比如/usr/local/go/bin和~/go/bin同时存在 - macOS 上用 Homebrew 装的,别直接删
/usr/local/go,先跑brew uninstall go;Ubuntu 用apt install golang-go装的,得用sudo apt remove --purge golang-go
清理环境变量与 shell 初始化文件
就算删了二进制,只要 $GOROOT 或 $GOPATH 还指向旧路径,新装的 Go 就会读错配置、缓存或构建输出位置。
- 搜索所有 shell 配置文件:
~/.bashrc、~/.zshrc、~/.profile、/etc/profile,删掉含GOROOT=、GOPATH=、export PATH=.*go的行 - 运行
unset GOROOT GOPATH再执行go env,确认输出里GOROOT是空或自动推导值,GOPATH是默认$HOME/go(不是旧路径) - 特别注意:某些 IDE(如 VS Code)或终端复用工具(tmux)会缓存旧环境变量,改完配置后要彻底重启终端或 reload shell(
source ~/.zshrc)
删除模块缓存与构建产物
Go 1.11+ 默认启用模块模式,$GOPATH/pkg/mod 下的依赖缓存不会随 Go 卸载自动清除。残留的旧版本 module cache 可能导致 go build 拉错依赖、校验失败或 go list -m all 输出混乱。
立即学习“go语言免费学习笔记(深入)”;
- 手动删掉整个模块缓存目录:
rm -rf $(go env GOPATH)/pkg/mod(注意:这会清空所有已下载的依赖,重装后首次go build会慢一点) - 清理构建缓存:
go clean -cache -modcache -i(-i同时删安装产物,避免go install命令仍调用旧二进制) - 检查
go env GOSUMDB,如果设为私有 sumdb 或关闭(off),重装后建议恢复默认sum.golang.org,否则go get可能静默跳过校验
验证新安装是否完全“干净”
装完新 Go 后,光看 go version 不够——得确认它不偷偷加载旧逻辑。
- 运行
go env -w GOROOT=""再go env GOROOT,应返回自动探测路径(如/usr/local/go),而非你手动设过的旧值 - 新建空目录,
go mod init test+go get github.com/gorilla/mux@v1.8.0,观察是否从头拉取模块,而不是复用pkg/mod里残留的 v1.7.x - 执行
go list -m all,所有路径应显示一致的主版本(如全是v1.8.0),若混着v1.7.0和v1.8.0,说明模块缓存没清干净或go.sum锁定了旧版
最常被忽略的是 shell 初始化文件里藏了一行 export PATH="/old/go/bin:$PATH",它比新 PATH 优先级高,导致 which go 看着是新的,实际运行的却是旧的二进制——务必逐行 grep 所有配置文件。










