gopls 未安装或 path 未配置导致 lsp-mode 失效;需用 go install 安装并确保 $gobin 在 path 中,emacs gui 需手动设置 path;lsp-describe-session 可查 server 路径;gopls 依赖 go.mod;dlv-dap 问题实为 dlv 未正确安装或未指定命令。

gopls 跑不起来,lsp-mode 就是空转——不是配置写得不对,而是 gopls 本身没活过来。
gopls version 命令报 command not found
这是最常见、也最容易被忽略的起点。lsp-mode 只负责启动和通信,真正干活的是 gopls 进程。如果终端里连 gopls version 都执行失败,Emacs 里再怎么配 lsp-deferred 都只是干等。
- 别用
brew install gopls或第三方包管理器装——路径和版本常不一致,且 Homebrew 的gopls包早已停止维护 - 必须用 Go 自带的安装方式:
go install golang.org/x/tools/gopls@latest - 装完立刻在终端运行
gopls version,输出应类似gopls version: v0.16.0;若提示command not found,说明$GOBIN(或$GOPATH/bin)不在$PATH里 - Emacs GUI 启动时(比如从 Dock 点开)不会继承 shell 的
PATH,需在init.el里显式补全:(setenv "PATH" (concat (getenv "HOME") "/go/bin:" (getenv "PATH")))
lsp-describe-session 显示 “no client connected”
说明 lsp-mode 没连上 gopls,但错误日志没弹出来,容易误判为“没反应”。这时候不能只看配置有没有加 (add-hook 'go-mode-hook 'lsp-deferred),得确认它真正在用哪个 gopls。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 在 Emacs 里执行
M-x lsp-describe-session,看 “Server Path” 字段是否为空或指向错误路径 - 对比终端里
which gopls的输出,两者必须一致;不一致就说明lsp-mode找错了二进制 - 强制指定路径:在配置中加
(setq lsp-gopls-server-command '("gopls")),避免它去猜 - 确保当前 buffer 是
.go文件,且所在目录有go.mod——gopls默认只在 module 根下工作,裸文件或 GOPATH 模式下会静默拒绝服务
补全慢、跳转卡、M-. 冻住几秒
这不是 Emacs 卡,是 gopls 在后台做语义分析。默认开启的几项分析对中大型项目就是 CPU 杀手,关掉立竿见影。
- 禁用测试分析:
(setq lsp-go-analyze-tests nil) - 禁用 staticcheck(Go 官方静态检查器):
(setq lsp-gopls-staticcheck nil) - 如果你不用
vendor/目录,关掉 vendor 扫描:(setq lsp-go-vendor nil) - 补全延迟仍明显?试试临时关掉
lsp-go-completeUnimported(补全未导入包),它会触发跨模块索引 - 改过
go.mod后,记得手动执行M-x lsp-go-reload-project,否则gopls不会重新加载依赖图
dlv-dap 启动卡在 “Starting dlv-dap”
这根本不是 dap-mode 的问题,而是 dlv 二进制没准备好。新版 dlv 已合并 DAP 支持,但很多人还卡在旧版或安装方式错误。
- 运行
dlv version,确认输出里有DAP Support: true和Build Type: Static;没有就重装 - 绝对不要用
go get github.com/go-delve/delve/cmd/dlv——它拉的是已归档的旧分支 - 正确安装命令:
go install github.com/go-delve/delve/cmd/dlv@latest -
dap-mode默认找dlv-dap这个命令名,但新版dlv只提供dlv一个二进制,必须显式指定:(setq dap-dlv-go-dlv-command "dlv") - 调试前确保 buffer 是
.go文件,且项目根目录下存在go.mod;否则dap-mode无法推导构建参数,会静默失败
所有环节都依赖 go.mod 存在且有效——没有它,gopls 不启动,dap-mode 不识别项目结构,连 go fmt 都可能用错格式规则。初始化项目永远是第一步:go mod init example.com/foo,别跳过。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










