以下文章来源于公众号 poslua,作者ms2008

背景

使用 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 支持。另外禁用 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

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

  1. vscode如何查看修改过的部分_编辑器 VS Code 如何快速查看 Go 接口?

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

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

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

  3. vscode如何创建一个go项目_如何用手机创建一个网站

    如何用手机创建网站?其实正确的说法是如何创建一个手机网站才对,因为很难用手机去制作网站,很不方便.一般是用电脑模拟手机去建网站. 我们知道现在很多人上网都是通过手机上网,所以我们自己建网站时,也要学会 ...

  4. Django从理论到实战(part3)--创建一个Django项目

    学习笔记,仅供参考 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的写一下. 文章目录 创建一个Django项 ...

  5. 如何创建一个javaWeb项目

    一.使用IDEA创建一个javaweb项目 截图中文可以直接按照截图查看,未汉化可以根据提示来进行创建 1.File->New Project选择Web Application 然后填写好路径和 ...

  6. react项目_保证一看就会 | 手把手教你创建一个React项目

    一.如何使用 git 在 GitHub 上创建一个项目 新建一个项目 首先,在github上注册自己的账号,然后登录后,可以看到如下界面,是你的主页.点击右边的➕号,选择第一个选项 填写项目信息 此时 ...

  7. 使用VSCode创建一个Vue项目

    使用VSCode创建一个Vue项目 vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的. 安装vue-cli之前,需要先安装了vue和webpack · node -v //( ...

  8. 把python37添加到环境变量配置_关于在win 10上成功创建一个Django项目时遇到django-admin的手动配置环境变量问题。...

    前言 初学Python Web 在创建第一个Djang项目的时候出现了很多的问题,今天和大家分享并记录一下这次艰难的历程! 一.官网下载Python以及安装Django 1.Python的下载安装 链 ...

  9. idea maven创建java项目_新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目(图文教程)...

    之前都没试过用maven来管理过项目,但是手动找包导包确实不方便,于是今天用2016版的IDEA进行了maven的初尝试. 打开IDEA,创建新项目: 然后选择Maven,以及选择自己电脑的jdk: ...

最新文章

  1. Java高并发编程:多个线程之间共享数据的方式探讨
  2. linux shell find depth,搞定 Linux Shell 文本处理工具,看完这篇集锦就够了
  3. Flex调用as文件中的类
  4. svm涉及的一些概念
  5. python快速排序算法_Python实现快速排序算法及去重的快速排序的简单示例
  6. Linux有问必答:如何检查Linux的内存使用状况
  7. 我们在进行着一场拔河比赛……
  8. [渝粤教育] 西南科技大学 电子产品制造工艺 在线考试复习资料
  9. wdcp mysql远程_CentOS下WDCP下的MYSQL开启远程连接
  10. 21 张让你代码能力突飞猛进的速查表(神经网络、线性代数、可视化等)
  11. php会员可见内容代码,DedeCMS内容隐藏指定字段仅对会员显示对游客不可见的实现方法...
  12. 虚拟CentOS访问Windows下共享文件(二)
  13. 一个专科生学习JAVA目标月薪2万是否不切实际?
  14. 前端设计模式(1)--工厂模式
  15. python统计excel数据总行数_python 统计excel行数据库
  16. 【转】兄弟俩玩的2000亿美元的公司,盖茨与鲍尔默:微软双雄上演终极接力
  17. CC2530串口通信
  18. 研磨设计模式-设计模式的基础-设计模式的学习【思路】
  19. 射频电路设计——射频器件基础
  20. Layui选项卡Tab和Layui模板laytpl冲突问题

热门文章

  1. mysql gtid 1236错误_解决mysql开启GTID主从同步出现1236错误问题
  2. 红米AirDots 蓝牙耳机 重置双耳连接
  3. 模板匹配算法_计算机视觉方向简介 | 多目标跟踪算法(附源码)
  4. 全球最大的半导体IP产业链,你了解多少?
  5. np 元素位置_证明SAT的NP完全性(NP-completeness)
  6. optipng可以优化压缩PNG图片文件格式
  7. 双非本科生如何才能进入腾讯、阿里、百度这些大厂?
  8. 数据库基础知识介绍(一)
  9. python3.6配置环境变量_Linux 安装Python和环境变量配置
  10. 模拟usb设备_今天写代码遇到Flutter没有连接设备问题解决