答案是GO111MODULE=off导致工具链无视go.mod、强制走GOPATH模式查找包,需执行go env -w GO111MODULE=on并重启VSCode使gopls生效。

go env GO111MODULE 输出 off 却报 cannot find package
这是典型的模式冲突:VSCode 或终端当前环境认为你在用 GOPATH 模式,但项目实际依赖 go.mod 文件,而 gopls 又因路径不在 $GOPATH/src 下拒绝加载——结果就是 import 报错、跳转失效、hover 显示 no packages returned。
关键判断依据不是有没有 go.mod,而是 go env GO111MODULE 的输出值。如果它返回 off,哪怕你手动建了 go.mod,Go 工具链也会无视它,坚持去 $GOPATH/src 找包。
- 先执行
go env GO111MODULE确认当前值;若为off或auto,立即运行go env -w GO111MODULE=on - 不要只改系统环境变量(如
setx GOPATH),GO111MODULE必须用go env -w写入 Go 的配置层,VSCode 的 Go 扩展才认 - 改完后重启 VSCode(不是重载窗口),否则
gopls仍会沿用旧配置启动
VSCode 启动后 echo $GOPATH 为空,但 go env GOPATH 有值
这说明 VSCode 图形界面没继承 shell 的环境变量,但 Go 命令自身能读到 go env 配置——两者来源不同:go env 读的是 Go 内部持久化配置,而 VSCode 终端/扩展读的是启动时的进程环境。
后果是:Go 插件提示 Failed to find GOPATH,gopls 日志里反复出现 no Go files in,自动格式化静默失败。
- macOS/Linux:别从 Dock 或桌面图标启动 VSCode,必须在终端中执行
code .(确保当前 shell 已 source~/.zshrc或~/.bash_profile) - Windows:用 PowerShell 运行
Start-Process code .,而非双击快捷方式;且setx GOPATH后需彻底关闭并重启所有终端和 VSCode - 不推荐在
.vscode/settings.json里硬写"go.gopath",现代 Go 开发几乎不需要它;若真要兼容老项目,优先配"go.toolsEnvVars": { "GOPATH": "..." }
go mod tidy 后 still cannot find package “github.com/xxx”
常见于国内网络环境下,go mod tidy 表面成功,但 go.sum 里记录的是 proxy 失败后的 fallback commit,导致 gopls 解析时找不到对应包路径。
典型现象:命令行 go run main.go 能跑,但 VSCode 里标红、跳转失败、hover 提示 could not import。
- 检查代理是否生效:
go env GOPROXY应输出类似https://goproxy.cn,direct;若为https://proxy.golang.org,direct,在国内大概率超时 - 强制刷新缓存:
go clean -modcache,再执行go mod download(不是tidy),观察是否有verifying github.com/xxx@vX.Y.Z成功日志 - 临时绕过 proxy 查私有库:
go env -w GOPRIVATE=git.example.com/internal,避免被 proxy 重定向
项目根目录有 go.mod,但 gopls 仍 fallback 到 GOPATH 模式
gopls 是否启用模块模式,不只看有没有 go.mod,更看它启动时的工作目录是否“被识别为 module 根”。一旦 VSCode 工作区打开的是父目录(比如整个 Git 仓库含多个子模块),或当前文件路径深度超过 go.mod 所在位置,gopls 就会退回到 GOPATH 模式并静默罢工。
表现是:代码补全卡顿、F12 跳转到 $GOROOT/src/fmt 却跳不过去第三方包、go list -m all 在终端正常,但在 VSCode 集成终端报错。
- 确保 VSCode 是直接打开包含
go.mod的那个文件夹(不是它的上级目录),路径栏应显示myproject/,而非workspace/myproject/ - 检查当前打开的
.go文件是否真属于该 module:它的 import path 应与go.mod第一行module xxx匹配;若文件在cmd/下但go.mod声明的是example.com/lib,gopls可能无法关联 - 不要在同一个 VSCode 窗口中混开多个不同 module 的项目;如需多项目,用多窗口,或明确用
File → Add Folder to Workspace并为每个 folder 单独设go.useLanguageServer
最易被忽略的一点:GO111MODULE 是全局开关,但 gopls 的行为还取决于你打开文件夹的路径精度和代理链路的完整性。任何一环断掉,它都不会报错,只会沉默——所以看到功能异常,第一反应不该是关语言服务器,而是查 gopls 日志(Cmd/Ctrl+Shift+P → Go: Toggle Log)和当前工作目录的 module 边界。


















