
go 1.4 起官方移除了 `src/pkg` 目录层级,将标准库源码直接置于 `goroot/src/` 下;若环境混用旧版 go 工具链(如 go 1.3)与新版 goroot(如 go 1.4+),会导致编译器错误地在 `src/pkg/fmt` 中查找包,从而报“cannot find package 'fmt'”错误。
该问题本质是 Go 工具链版本与 GOROOT 内容不匹配,而非配置错误或安装损坏。从你提供的 go env 输出可见:
- GOROOT=C:\Go(对应 Go 1.4+ 安装,其 src 下无 pkg 子目录)
- 但 GOTOOLDIR=C:\Go\pkg\tool\windows_amd64 显示工具链仍在尝试访问旧路径结构(pkg/tool 是 Go 1.3 及更早版本的典型路径)
这说明当前系统 PATH 中实际调用的 go 可执行文件很可能来自 早期版本的 Go 安装(如 Go 1.3),而 GOROOT 却指向了新版(Go 1.4+)的根目录——造成“头身不一”的兼容性断裂。
✅ 验证与修复步骤如下:
-
确认当前 go 命令来源及版本
在命令行中运行:where go go version
若输出类似 C:\prgs\go\go1.3.2\bin\go.exe 或 go version go1.3.2 windows/amd64,即证实混用了旧版二进制。
-
清理冲突的 Go 安装
- 卸载所有通过 MSI 安装的 Go 版本(控制面板 → 程序和功能)
- 手动删除残留目录(如 C:\prgs\go\go1.3.*、C:\Go 若非最新版)
- 清空 PATH 中所有非目标 Go 的 bin 路径(例如 C:\prgs\go\go1.3.2\bin)
-
推荐方式:使用 ZIP 归档干净重装(无注册表干扰)
下载官方 ZIP 包(如 go1.22.5.windows-amd64.zip),解压至任意位置(例如 D:\go),然后设置环境变量:set GOROOT=D:\go set PATH=%GOROOT%\bin;%PATH% set GOPATH=%USERPROFILE%\go # 推荐默认值,无需额外创建
✅ 注意:ZIP 版本完全独立,避免 MSI 安装器可能遗留的多版本 PATH 干扰。
-
验证修复结果
go env GOROOT GOTOOLDIR dir "%GOROOT%\src\fmt" # 应存在 _const.go、print.go 等文件 go run hello.go # 正常输出 "Hello, World!"
? 关键总结:
- Go 1.4 是分水岭:src/pkg/fmt → src/fmt,工具链必须与 GOROOT 版本严格对齐;
- 不要手动复制或创建 src/pkg 目录——这是向后不兼容的无效补救;
- Windows 上优先选用 ZIP 安装 + 手动 PATH 配置,可彻底规避 MSI 多版本共存陷阱;
- GOPATH 对此问题无影响(标准库查找仅依赖 GOROOT 和工具链一致性)。
完成上述操作后,go run hello.go 将正确解析 fmt 包并成功执行。










