go mod init 必须在项目根目录执行,否则 go.mod 和 go.sum 会错位;正确流程是先建空文件夹并用 VS Code 打开整个文件夹,再新建 main.go,最后在集成终端中运行 go mod init github.com/yourname/myapi。

go mod init 必须在项目根目录执行,否则 go.sum 和 go.mod 会错位
很多初学者在 VS Code 里新建一个 main.go 就直接敲 go run main.go,结果后续 go mod init 时发现依赖没被记录、go.sum 空或报 no required module provides package。根本原因是模块初始化路径和实际代码路径不一致。
正确做法是:先建空文件夹(如 myapi),用 VS Code 打开整个文件夹(不是单个文件),再新建 main.go,最后在集成终端中运行:
go mod init github.com/yourname/myapi
这样生成的 go.mod 才能被 VS Code 的 Go 扩展识别为工作区模块根。如果已错位,删掉错误位置的 go.mod 和 go.sum,cd 到正确根目录重做即可。
VS Code 的 go.useLanguageServer 必须为 true,否则 go mod 相关提示(如未导入包自动补全)基本失效
Go 扩展默认启用语言服务器 gopls,但某些旧配置或手动修改可能把它关了。关闭后你会遇到:保存时不自动加 import、跳转定义失败、go.mod 里的依赖点击无响应、甚至 go list -m all 报错。
立即学习“go语言免费学习笔记(深入)”;
检查方式:打开 .vscode/settings.json,确认包含:
"go.useLanguageServer": true
如果没写,加上;如果值是 false,改成 true。改完重启 VS Code 或按 Ctrl+Shift+P → 输入 Developer: Restart Language Server 即可生效。
注意:gopls 启动依赖 GO111MODULE=on 和有效的 GOPROXY,这两项必须提前配好,否则语言服务器会卡在 “Starting…” 状态。
go env -w 配置代理后,VS Code 终端仍走系统默认代理?检查 go.toolsEnvVars
即使你在终端执行了 go env -w GOPROXY=https://goproxy.cn,direct,VS Code 内置终端有时仍无法下载工具(比如安装 gopls 失败,报错 dial tcp ...: connectex: A connection attempt failed)。这是因为 VS Code 的 Go 扩展默认不继承 shell 的环境变量,尤其在 Windows 或某些 macOS 终端配置下。
解决方法是在项目级或用户级 settings.json 中显式声明:
"go.toolsEnvVars": {
"GOPROXY": "https://goproxy.cn,direct",
"GO111MODULE": "on"
}
这个配置会强制所有 Go 工具(包括 gopls、goimports、dlv)使用指定环境变量,绕过 shell 继承问题。如果公司有私有仓库,顺手加上 "GOPRIVATE": "git.mycompany.com"。
调试时 launch.json 的 program 字段不能指向 main.go,必须指向模块根或可执行目标
常见错误配置:
"program": "${workspaceFolder}/cmd/main.go"
这会导致 Delve 启动失败,报错类似 could not launch process: could not get the executable path for 'main.go'。因为 dlv 不接受源文件路径,它需要一个已构建或可构建的模块上下文。
正确写法分两种场景:
- 模块根目录含
main.go(即单文件服务):"program": "${workspaceFolder}" - 标准布局含
cmd/myapp/main.go:"program": "${workspaceFolder}/cmd/myapp"
同时确保 "env" 包含 "GO111MODULE": "on",否则 Delve 可能退回到 GOPATH 模式,找不到模块依赖。
最易被忽略的是:VS Code 的 Go 扩展不会自动为你把 go.mod 里的 replace 指令同步到 gopls 的分析路径里。如果你用了 replace github.com/some/pkg => ./local-pkg,但 ./local-pkg 没被 VS Code 当作工作区打开,跳转定义和类型检查就会断连——这时得手动在 settings.json 里加 "gopls": { "experimentalWorkspaceModule": true } 并重启语言服务器。



















