
当 Go 工具检测到 $GOPATH 目录下存在类似 Go 标准安装结构(如 src, pkg, bin 子目录),便会拒绝执行 go get,报错“is a GOROOT, not a GOPATH”——这并非环境变量配置错误,而是目录内容冲突所致。
当 go 工具检测到 `$gopath` 目录下存在类似 go 标准安装结构(如 `src`, `pkg`, `bin` 子目录),便会拒绝执行 `go get`,报错“is a goroot, not a gopath”——这并非环境变量配置错误,而是目录内容冲突所致。
该错误常见于开发者误将 Go 源码或完整安装包解压/克隆到了 $GOPATH 目录(例如 /home/azhukov/go),导致该路径同时具备 GOROOT 典型特征(如含 src/runtime、pkg/tool/ 等)和 GOPATH 身份,触发 Go 工具的保护性校验。
在你的环境中:
-
GOPATH="/home/azhukov/go"✅ 设置正确 -
GOROOT="/usr/local/go"✅ 独立且规范 - 但
/home/azhukov/go目录内实际存在 Go 源码或构建产物(如手动下载的go/src、go/pkg),使go get认为其是另一个 Go 安装根目录,从而中止操作。
✅ 根本解决步骤:
-
确认并清理污染的 GOPATH
# 检查是否存在疑似 GOROOT 结构 ls -F /home/azhukov/go/ # 若看到 src/, pkg/, bin/(尤其是 src/cmd 或 src/runtime),即为污染源
-
安全清理(保留你自己的代码,移除 Go 源码)
cd /home/azhukov/go # 删除由 Go 安装/编译产生的标准目录(非你开发的项目) rm -rf src pkg bin # ⚠️ 注意:仅删除这些目录!勿删你自己的项目(如位于 src/github.com/yourname/ 的代码)
-
重新运行 go get
go get -v github.com/constabulary/gb/...
此时
go get将正常创建src/,pkg/,bin/并完成安装。
? 关键注意事项:
-
GOPATH必须是纯净的工作区,不能包含 Go 标准库源码或工具链二进制文件; -
GOROOT是 Go 运行时与编译器所在位置(通常为/usr/local/go或 SDK 解压路径),GOPATH是用户代码与依赖的存放地,二者物理路径必须严格分离; - Go 1.8+ 对此校验更严格,即使
GOROOT未显式设置,只要GOPATH内部结构匹配 GOROOT 特征,就会报错; - 若需调试 Go 源码,应单独设置
GOROOT_BOOTSTRAP或使用go/src的只读副本,而非混入GOPATH。
✅ 验证修复后状态:
# 应仅显示你自己的项目(如 gb 的源码将出现在 src/github.com/constabulary/gb) ls -d $GOPATH/src/*/* # $GOPATH/bin/gb 应可执行 $GOPATH/bin/gb version
遵循以上操作,即可彻底解决 cannot download, ... is a GOROOT, not a GOPATH 错误,确保 go get 及后续模块管理行为符合预期。

















