根本原因是gopls未读取正确的模块上下文和代理配置;必须确保go.mod在工作区根目录、goproxy设为"https://goproxy.cn,direct"、gonoproxy处理私有模块,并重启gopls生效。

Go Modules 在 VSCode 中无法正常解析依赖,根本原因不是插件没装全,而是 gopls 没读到正确的模块上下文和代理配置——改完环境变量不重启语言服务器,等于没改。
go.mod 缺失或不在工作区根目录
VSCode 的 gopls 默认只在含 go.mod 的目录下启用 Modules 模式;否则退化为 GOPATH 模式,所有依赖跳转、补全都会失效。
- 新建项目时,先在终端 cd 到空目录,执行
go mod init example.com/myapp生成go.mod - VSCode 必须以该目录为工作区根目录打开(File → Open Folder),不能只打开单个
.go文件 - 如果已有代码但没
go.mod,运行go mod init后必须再跑一次go mod tidy,否则gopls仍会报no required module provides package
GOPROXY 配置未生效或格式错误
国内直连 proxy.golang.org 基本超时,但错配 GOPROXY 会导致私有包 404 或校验失败,比单纯超时更难排查。
- 推荐值:
"https://goproxy.cn,direct"——末尾direct不可省略,否则公司内网 Git 仓库会因被代理而返回 404 - 绝对不要用
https://mirrors.aliyun.com/goproxy/,它不支持/@v/v1.2.3.info这类语义化路由,gopls启动时直接崩溃 - 配置位置优先级:VSCode 工作区设置 > 用户设置 > 系统环境变量;建议统一写在 VSCode 的
settings.json里:"go.toolsEnvVars": {"GOPROXY": "https://goproxy.cn,direct"}
gopls 缓存旧环境或未重载模块状态
gopls 启动后不会自动感知 go.mod 变更或新设的环境变量,手动触发重启是唯一可靠方式。
- 快捷键:
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS),输入Go: Restart Language Server并回车 - 重启后观察右下角状态栏是否显示
gopls (running),而非gopls (starting...)卡住 - 若仍提示 “no package”,在终端执行
go mod tidy再重启 ——gopls依赖go.sum和go.mod的一致性
私有模块未绕过代理导致 403/404
公司内部 GitLab 或 GitHub 私有库走公共代理必然失败;GONOPROXY 是唯一合规解法,replace 只适用于本地开发阶段。
- 设环境变量:
go env -w GONOPROXY="git.corp.company,example.com/internal",多个域名用英文逗号分隔 - 支持通配符:
*.corp.company匹配所有子域名,但不匹配路径(git.corp.company/foo有效,git.corp.company/foo/bar无效) -
GONOPROXY优先级高于GOPROXY,且无需重启gopls—— 但修改后需重新运行go mod download触发拉取
真正卡住的往往不是配置本身,而是 gopls 没 reload 模块元数据,或者 go.mod 路径不对。改完记得先 go mod tidy,再 Restart Language Server,别跳步。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











