vscode怎么看调用的接口_编辑器 VS Code 如何快速查看 Go 接口?

在阅读 Go 项目源码时,VS Code 能够通过 Go to Implementation 功能追踪接口定义,但不直接显示具体实现。本文介绍了如何利用 gopls 快速定位 Go 接口的实现,同时讨论了 gopls 与 guru 的优缺点,以及在 vscode 中配置 gopls 的方法,包括禁用特定功能以继续使用 guru。此外,还分享了作者的完整 vscode Go 项目配置,并提供了相关参考资料。
摘要由CSDN通过智能技术生成

使用 vscode 阅读 Go 项目源码时,有个不太方便的地方,就是跟踪interface的实现。vscode 只能追到interface定义的地方,而无法定位到其具体的实现。比如,我在追 etcd 关于 revision 的读取的时候只能追到这里:

c0752a4c10bce0ce07e400c56258e422.png

如果项目比较小,还比较容易对付,因为按照习惯来讲,其实现往往都在对应接口的下方。但是遇到这种像 etcd 的项目就抓瞎了,因为其实现可能会跨越多个文件。好在 vscode 有个非常好用的功能:Go to Implementation

66bf61e5e290807dfb38123d4570c211.png

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(其实已经实现了,只是还没有发布)

如果你想现在就用上这个特性,可以有两个选择:

自己编译 master 分支的 gopls

使用 bingo 的 lsp( bingo 的作者参考了 guru 的实现单独 fork 了一个版本)

当然也可以用我目前的方案:

我的 Go 项目基本都会拷贝 vendor,所以并不希望开启 mod 支持。另外禁用gopls的goToTypeDefinition、goToImplementation选项,这样 vscode 就会继续用guru的实现。

此外,linter 工具我选择的是golangci-lint,并没有使用官方的golint,主要是因为后者烦人的「exported method should have comment or be unexported」建议,而前者还支持检测内存对齐,非常有用。

最后贴下我的完整配置:

//

For

Golang

//

"go.goroot"

:

"C:\\go"

,

//

"go.gopath"

:

"${workspaceRoot}"

,

"go.useLanguageServer"

:

true

,

"go.inferGopath"

:

true

,

"go.buildOnSave"

:

"off"

,

"go.lintTool"

:

"golangci-lint"

,

"go.lintFlags"

:

[

"--disable-all"

],

"go.vetFlags"

:

[],

"go.autocompleteUnimportedPackages"

:

true

,

"go.gotoSymbol.includeImports"

:

false

,

"go.gotoSymbol.includeGoroot"

:

false

,

"go.useCodeSnippetsOnFunctionSuggest"

:

true

,

"go.formatTool"

:

"goreturns"

,

"go.docsTool"

:

"gogetdoc"

,

"[go]"

:

{

"editor.snippetSuggestions"

:

"top"

,

"editor.formatOnSave"

:

true

,

"editor.codeActionsOnSave"

:

{

"source.organizeImports"

:

true

}

},

"go.toolsEnvVars"

:

{

"GO111MODULE"

:

"off"

,

"GOPROXY"

:

"https://goproxy.cn,direct"

,

"GOSUMDB"

:

"gosum.io+ce6e7565+AY5qEHUk/qmHc5btzW45JVoENfazw8LielDsaI+lEbq6"

,

},

"go.languageServerExperimentalFeatures"

:

{

"format"

:

true

,

"autoComplete"

:

true

,

"rename"

:

true

,

"goToDefinition"

:

true

,

"hover"

:

true

,

"signatureHelp"

:

true

,

"goToTypeDefinition"

:

false

,

"goToImplementation"

:

false

,

"documentSymbols"

:

true

,

"workspaceSymbols"

:

true

,

"findReferences"

:

true

,

"diagnostics"

:

false

,

"completeUnimported"

:

true

,

"watchFileChanges"

:

true

,

"deepCompletion"

:

true

,

},

"go.languageServerFlags"

:

[

"-rpc.trace"

,

"serve"

,

"--debug=localhost:6060"

,

],

参考文献

Search for implementations doesn't work

x/tools/gopls: support module-local implementation request

Use gogetdoc instead of godef and godoc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值