asdf list all go 显示的是远程插件仓库的可用版本列表,而非本地已安装版本;失败常因国内无法访问 go.dev/dl/ 等源,需换镜像或配代理。

为什么 asdf install go 失败后 asdf list all go 仍显示旧版本
因为 asdf list all go 查的是插件仓库里的版本列表(远程 Git tag),不是本地已安装的版本。它不反映你机器上实际有没有装成功,只告诉你“理论上能装哪些”。常见失败原因是网络卡在下载 golang.org/x/sys 或 go.dev/dl/ 重定向跳转——国内直连基本会超时或 403。
- 先确认插件是否最新:
asdf plugin update go - 换镜像源:在
~/.asdf/plugins/go/bin/install里把https://go.dev/dl/替成https://golang.google.cn/dl/(注意路径末尾斜杠不能少) - 如果用 zsh/bash,临时加代理更稳:
HTTPS_PROXY=http://127.0.0.1:7890 asdf install go 1.22.5
多个 Go 版本共存时 asdf global go 不生效
根本原因不是 asdf 配置错了,而是 shell 启动时没加载 asdf 的 shims 路径。即使你执行了 asdf global go 1.21.10,which go 还是返回系统自带的 /usr/local/bin/go,说明 ~/.asdf/shims 没进 $PATH 前端。
- 检查
echo $PATH是否以~/.asdf/shims开头;不是?补到~/.zshrc或~/.bashrc最顶部:export PATH="$HOME/.asdf/shims:$PATH" - 别用
source ~/.asdf/asdf.sh后再 reload,那只是激活 asdf 命令本身,不自动注入 shims - 改完配置记得
exec $SHELL或新开终端,which go应该输出~/.asdf/shims/go
go mod download 在 asdf 切换版本后报 checksum mismatch
Go 的 module cache($GOPATH/pkg/mod)默认不按 Go 版本隔离。1.21 下下载的包,1.22 可能因校验逻辑微调而拒绝加载,尤其当你混用 vendor 和 proxy 时。
- 最稳妥做法:每个 Go 版本配独立
GOPATH,比如export GOPATH=$HOME/go-1.22,并在.tool-versions同级放.env文件写入该变量 - 快速清理:删掉
$GOPATH/pkg/mod/cache/download下对应模块的校验文件(名字含.ziphash),再go mod download - 别依赖
GO111MODULE=off回退——它绕过 module 但不会修复已损坏的 cache
项目级 Go 版本锁定失效:.tool-versions 被忽略
只有当前目录或父目录存在 .tool-versions,且你 cd 进该项目根目录时,asdf 才自动切换。但它不会监听子目录变化,也不会在 go run main.go 时重新校验。
立即学习“go语言免费学习笔记(深入)”;
- 确认
.tool-versions文件在项目根目录,内容形如:go 1.22.5(不能有多余空格或注释) - 运行
asdf current go看当前生效版本,不是go version——后者可能被 alias 或 PATH 顺序干扰 - CI/CD 场景下,
asdf exec go build比裸写go build更可靠,它强制走 shims 层并读取当前目录规则
真正麻烦的是交叉编译和 cgo 依赖——不同 Go 版本对 CGO_ENABLED 默认值、libc 头文件路径的处理有差异,这时候光靠 asdf 切换不够,得配合 GOOS/GOARCH 显式声明,否则构建产物可能在目标环境跑不起来。










