背景
使用 vscode 阅读 Go 项目源码时,有个不太方便的地方,就是跟踪 interface
的实现。vscode 只能追到 interface
定义的地方,而无法定位到其具体的实现。比如,我在追 etcd 关于 revision 的读取的时候只能追到这里:
如果项目比较小,还比较容易对付,因为按照习惯来讲,其实现往往都在对应接口的下方。但是遇到这种像 etcd 的项目就抓瞎了,因为其实现可能会跨越多个文件。好在 vscode 有个非常好用的功能:Go to Implementation
Ctrl+F12
就能找到实现了该 interface
的所有方法,然后再结合上下文,这样就很容易把调用关系都串下来。
vscode 之所以能够找到这些调用关系,依赖的是 Go 官方提供的代码导航工具:guru
,它有几个缺点:
查找速度慢
不支持 Go Module
官方不再维护
gopls
微软在开发 VS Code 过程中, 定义一种协议, 语言服务器协议:Language Server Protocol,用来统一不同语言的静态检测、自动补全问题。
gopls
就是 Go Team 目前正在积极维护的 lsp,有望成为 vscode Go 插件的默认补全工具。它最大的优点就是非常快,和 guru
相比有质的提升,同时还支持 Go Module。当然也少不了缺点:不支持 Go to Implementation(其实已经实现了ÿ