背景

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

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

  1. 自己编译 master 分支的 gopls

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

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

我的 Go 项目基本都会拷贝 vendor,所以并不希望开启 mod 支持。另外禁用 goplsgoToTypeDefinitiongoToImplementation 选项,这样 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

推荐阅读

  • 用 70 行 Go 代码击败 C 语言

  • Go 语言最优秀的 IDE:免费获取 Goland,你有资格吗?


喜欢本文的朋友,欢迎关注“Go语言中文网”:

Go语言中文网启用微信学习交流群,欢迎加微信:274768166

vscode如何查看修改过的部分_编辑器 VS Code 如何快速查看 Go 接口?相关推荐

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

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

  2. vscode如何创建一个go项目_编辑器 VS Code 如何快速查看 Go 接口?

    以下文章来源于公众号 poslua,作者ms2008 背景 使用 vscode 阅读 Go 项目源码时,有个不太方便的地方,就是跟踪 interface 的实现.vscode 只能追到 interfa ...

  3. CAD小白要怎么查看CAD图纸呢?像建筑CAD图纸怎么快速查看呢?

    CAD小白要怎么查看CAD图纸呢?像建筑CAD图纸怎么快速查看呢?相信不少刚刚开始接触CAD的人都会有这样的疑问,那么我们究竟要怎么样才能快速的看懂建筑图纸呢?查看CAD建筑图纸有什么技巧呢?这里给小 ...

  4. html一键查看源代码,在ie7中快速查看修改网页html源代码_网页浏览

    在我们浏览Internet时,常常需要查看网页html文件的源代码.在IE7中,要实现这一点,同IE6没有太大的区别,操作相当简单,只需在网页空白处单击鼠标右键选择"查看源文件"或 ...

  5. 查看可执行文件的运行架构_在运行查询之前如何查看结果集的架构

    查看可执行文件的运行架构 介绍 (Introduction) Suppose you've been asked to run a query against some SQL Server data ...

  6. easyui 修改单元格内容_初学Excel办公软件快速修改文字的方法

    今天我们学习Excel办公软件快速修改文字的方法,首先我们看这个表格里面的文字很多都是相差一个字,甚至很多内容相差不大,因此我们在输入文字时就需要改进快速方法了. 首先我们根据图片来操作,我们修改红色 ...

  7. 查看mysql服务器状态命令_在linux中,怎样查看Mysql服务运行状态?

    展开全部 使用命令 # service mysqld status 命令来查看mysql 的启动状态如图所示: mysqld is stopped 那就说明mysql服务是62616964757a68 ...

  8. 第14章_视图(创建视图、查看视图、更新视图的数据、修改、删除视图)

    第14章_视图 第14章_视图 1. 常见的数据库对象 2. 视图概述 2.1 为什么使用视图? 2.2 视图的理解 3. 创建视图 3.1 创建单表视图 3.2 创建多表联合视图 3.3 基于视图创 ...

  9. EF里查看/修改实体的当前值、原始值和数据库值

    EF里查看/修改实体的当前值.原始值和数据库值以及重写SaveChanges方法记录实体状态 - 心态要好 时间 2013-09-10 09:09:00 博客园_汪杰的cnBlogs 原文  http ...

最新文章

  1. GIA张怡:关于小白入门AI算法工程师的直播分享
  2. 用bert来训练quoras question pairs的代码仓
  3. 9号团队-团队任务4:每日立会(2018-11-26,2018-11-27)
  4. 消息队列设计的精髓基本都藏在本文里了
  5. java 数组练习题,Java练习题 - 数组01
  6. 搭建分布式架构4--ZooKeeper注册中心安装
  7. 【SpringBoot】SpringBoot 操作 Excel 完整示例(含源码GitHub)
  8. 作为程序员,北漂的我有很多话想说。
  9. java反编译之 基础篇(class未加密未混淆)
  10. 学生成绩表mysql_mysql 学生成绩表例题
  11. MySQL索引数据结构与算法
  12. 如何免费在本地播放flv格式的视频
  13. 2017第八届蓝桥杯决赛(大学B组)java试题 瓷砖样式
  14. Android 实现微信界面
  15. JDK1.8源码分析:LinkedList
  16. C语言BCC异或效验
  17. 命令行下批量下载网易相册
  18. python合法标识符_Python isidentifier()判断是否为Python的合法标识符
  19. 一起来分解一个Netty应用
  20. 报童问题求解最大利润_仿真实例009:汽车天线仿真(双向混合求解)

热门文章

  1. 创建表空间时ora-01119和ora-27040的处理
  2. Ubuntu 12.04 Server OpenStack Havana多节点(OVS+GRE)安装
  3. 关于360举报恶意软件有数字签名的回复
  4. 什么是元宇宙、新基建、赛博空间?7个最火科技名词解释,都在这里了
  5. 最新!外国人最常说的100个“中国词”出炉 第一个你绝对想不到…
  6. libjpeg移植到arm
  7. 图像sobel梯度详细计算过程_视频处理之Sobel【附源码】
  8. 拿到大厂Offer了!
  9. 删库不必跑路,谈数据库删除设计
  10. SpringBoot + Spring Security 简单入门