答案是go get下载的包不在$GOPATH/src而在$GOPATH/pkg/mod,因启用了Go Modules模式(GO111MODULE=on),此时依赖存于模块缓存而非src目录,需检查go env GOMOD确认是否在module模式下。

go get 不报错但包没下载到 $GOPATH/src?
这通常不是命令失败,而是你当前处于 Go Modules 模式(GO111MODULE=on),而 go get 默认把包存进模块缓存($GOPATH/pkg/mod),不再写入 $GOPATH/src。旧项目或文档里写的“去 src 里找包”在 Modules 下已不适用。
验证方式:运行 go env GOPATH 和 go env GOMOD。如果后者输出一个 .mod 文件路径,说明你在 module 模式下;此时 go get github.com/gorilla/mux 实际把代码放在 $GOPATH/pkg/mod/cache/download/github.com/gorilla/mux,而非 $GOPATH/src/github.com/gorilla/mux。
- 想强制走 GOPATH 模式?临时设
GO111MODULE=off,再执行go get - 想保留 Modules 但确认包已拉取?用
go list -m all | grep gorilla - 编辑器(如 VSCode)找不到包?确保
gopls已加载当前 module(检查状态栏是否显示项目名 +go.mod)
import "github.com/xxx/yyy" 编译报 cannot find package?
错误本质是 Go 编译器没在任何已知位置找到该路径对应的源码目录。常见原因不是没下载,而是路径没对上。
典型陷阱:
立即学习“go语言免费学习笔记(深入)”;
- 你执行了
go get github.com/xxx/yyy,但代码里写的是import "yyy"—— 必须用完整路径import "github.com/xxx/yyy" - 项目根目录下没有
go.mod,且当前不在$GOPATH/src/github.com/xxx/yyy目录里运行go build—— Go 不会跨 GOPATH 搜索子目录 - 用了相对导入(如
import "./mypkg")混在第三方包中 —— Go 不允许混合使用相对路径和绝对导入路径
快速验证:手动检查 $GOPATH/src/github.com/xxx/yyy 是否存在(Modules 关闭时);或运行 go mod graph | grep xxx(Modules 开启时)。
go get 报 exec: "git": executable file not found in $PATH?
这不是 Go 的问题,是系统缺 VCS 客户端。Go 会根据导入路径自动选择工具:github.com → git,code.google.com(历史)→ hg,某些私有仓库可能用 svn。
解决步骤很直接:
- Linux/macOS:运行
which git,若为空,用包管理器安装,例如sudo apt install git或brew install git - Windows:确认 Git for Windows 已勾选 “Add Git to PATH”,或手动把
C:\Program Files\Git\cmd加进系统环境变量PATH - 验证:终端输入
git version,有输出即 OK;再试go get -v github.com/spf13/cobra
注意:某些企业内网镜像源要求配置 git 协议代理,此时还需设 git config --global http.https://xxx.com.proxy http://proxy.company.com。
VSCode 里写 import 却没自动补全或加 import?
根本原因是 gopls 没正确加载项目上下文,而不是插件没装或 Go 没装好。
排查顺序:
- 打开命令面板(Ctrl+Shift+P),运行
Go: Restart Language Server - 确认当前打开的文件夹是 module 根目录(含
go.mod);如果不是,用File > Open Folder重新打开 - 检查底部状态栏:应显示类似
go (hello-world),括号内是 module 名;若显示go (no module),说明没识别到 module - 终端执行
go list -m,看是否报not in a module;是的话,在项目根目录运行go mod init example.com/hello
别忽略这点:gopls 启动时会扫描整个 module 依赖树,大型项目首次加载可能需 10–30 秒,期间补全不可用 —— 等状态栏图标停止旋转再试。


















