植物百科网
当前位置: 首页 农业百科

vscode的优势是什么(VSCode建议你启用gopls)

时间:2023-05-12 作者: 小编 阅读量: 4 栏目名: 农业百科

目前该协议得到了编辑器和语言社区的广泛支持。语言服务器协议背后的思想是为这些服务器和开发工具的通信方式提供标准化协议支持。LSP是语言提供商和工具供应商的双赢!服务器的响应包含文档URI和该符号在该文档中的定义位置。在LSP官网列出了相关的实现,包括三个部分。也就是说gopls是Go官方维护的、对LSP的实现,即一个Go语言的官方LanguageServer。进一步了解gopls首先说明下,目前gopls还不是稳定版本,处于alpha状态,所以VSCode默认没有启用它。

要谈 gopls,得先聊聊 LSP。

LSP 是什么

LSP,全称 Language Server Protocol,即语言服务器协议,这是微软创建的一个协议(目前已有 Codenvy,Red Hat 和 Sourcegraph 等公司一起支持它的发展)。定义了在编辑器或 IDE 中与语言服务器之间使用的协议,该语言服务器提供诸如自动完成,转到定义,查找所有引用等语言功能。语言服务器索引格式(LSIF,其发音类似于“ else if”)的目标是支持开发工具或 Web UI 中的富代码导航,而不需要源代码的本地副本。

目前该协议得到了编辑器和语言社区的广泛支持。

LSP 的官方网站:https://microsoft.github.io/language-server-protocol/,GitHub 地址:https://github.com/Microsoft/language-server-protocol。目前最新版本(2020-09-06):3.15。

LSP 解决了什么问题

为编程语言添加诸如自动完成、转到定义或鼠标悬停出现文档之类的功能需要付出大量的努力。传统上,这项工作必须为每个开发工具重复进行,因为每个工具为实现相同的特性提供不同的 api。

语言服务器(Language Server)旨在提供特定语言的智能功能,并通过支持进程间通讯协议与开发工具进行通信。

语言服务器协议(LSP)背后的思想是为这些服务器和开发工具的通信方式提供标准化协议支持。通过这种方式,可以在多个开发工具中重用单个 Language Server,而这些工具反过来可以用最少的工作支持多种语言。

例如,之前需要为 VSCode 构建 Go 插件、为 Sublime Text 构建 Go 插件、为 Vim 构建 Go 插件、为 Sourcegraph 构建 Go 插件,很多重复的工作。现在,对于每种语言,LSP 允许语言社区将精力集中在一个高性能语言服务器上,这个服务器可以提供代码完成,悬停文档提示、跳转到定义、查找引用等功能,而编辑器和客户端社区可以专注于构建一个单一的、高性能的、直观的和惯用的扩展,这个扩展可以与任何语言服务器通信,即时提供深入的语言支持。

LSP 是语言提供商和工具供应商的双赢!

LSP 的工作原理

语言服务器(Language Server)作为单独的进程运行,开发工具在 LSP 基础上通过 JSON-RPC 与服务器通信。下面是一个开发工具和语言服务器在进行编辑时如何通信的例子:

图片来自 LSP 官网,演示了协议如何在文档引用(uri)和文档位置级别与语言服务器通信。这些数据类型与编程语言无关,适用于所有编程语言。

  • 用户在开发工具中打开一个文件(称为文档):开发工具通知语言服务器文档已打开(textDocument/didOpen)。从现在开始,关于文档内容的真实信息不再存储在文件系统中,而是由开发工具保存在内存中。现在必须在开发工具和语言服务器之间同步内容。
  • 用户进行编辑:该开发工具通知服务器文档更改(textDocument/didChange),并由语言服务器更新文档的语言表示形式。在这种情况下,语言服务器会分析这些信息,并将检测到的错误和警告通知开发工具(textDocument/publishDiagnostics)。
  • 在打开的文档中,用户就一个符号(symbol)执行 Go to Definition:该开发工具发送一个带有两个参数的 “textdocument/Definition” 请求:(1)文档 URI 和(2)发出 “Go to Definition” 请求的文本位置,发送到服务器。服务器的响应包含文档 URI 和该符号在该文档中的定义位置。
  • **用户关闭文档(文件) **:开发工具发出 “textDocument/didClose” 的通知,告知语言服务器文档现在不在内存中了。文件系统上的当前内容现在是最新的。

看一个具体的 “textDocument/definition” 示例,以 Go 语言为例,请求如下:

{"jsonrpc":"2.0","id":1,"method":"textDocument/definition","params":{"textDocument":{"uri":"/Users/xuxinhua/project/golang/lsp/use.go"},"position":{"line":3,"character":12}}}

对此请求的响应:

{"jsonrpc":"2.0","id":1,"result":{"uri":"/Users/xuxinhua/project/golang/lsp/provide.go","range":{"start":{"line":0,"character":4},"end":{"line":0,"character":11}}}}

如果你想要开发一个 Language Server,可以看官方的协议规范。

gopls 是什么

经过上面对 LSP 的介绍,你应该猜到 gopls(读音:go please) 是什么了吧?!没错,gopls 是 LSP 的一个语言端(Server)实现,是针对 Go 语言的 LSP 实现。

在 LSP 官网列出了相关的实现,包括三个部分。

1、Language Servers:列出各个语言的 LSP 实现

其中 Go 语言的实现有两个:(Sourcegraph 的不再维护,因为集中维护一个会更好)

在另一个由 Sourcegraph 维护的网站 https://langserver.org/ 中,不但列出了实现 LSP 的语言,而且给出了它们对协议的实现完整性。

也就是说 gopls 是 Go 官方维护的、对 LSP 的实现,即一个 Go 语言的官方 Language Server

2、LSP Clients:列出支持 LSP 的开发工具

包括 VSCode、Sublime Text、Atom、Emacs、Vim 和 Eclipse 等很多开发工具。在上文提到的两个网站都有列出。

3、SDKs for LSP:为了方便开发

为了方便开发,还有一些 LSP 的 SDK 可以使用。具体可以查看:https://microsoft.github.io/language-server-protocol/implementors/sdks/。

进一步了解 gopls

首先说明下,目前 gopls 还不是稳定版本,处于 alpha 状态,所以 VSCode 默认没有启用它。项目地址:https://github.com/golang/tools/tree/master/gopls。

目前 gopls 支持的特性包括:

  • Autocompletion
  • Jump to definition
  • Signature help
  • Hover
  • Document symbols
  • References
  • Rename

目前已知存在如下的问题:

  1. Editing multiple modules in one editor window: #32394[1]
  2. Type checking does not work in cgo packages: #35721[2]
  3. Does not work with build tags: #29202[3]
  4. Find references and rename only work in a single package: #32877[4]

当前 gopls 的工作重点是确保稳定性(期待发布 1.0 版本),之前一直受诟骂的是资源占用,目前已经好太多了。

有如下编辑器支持 gopls,你可以根据自己喜爱的编辑器查看相应的安装、配置说明。

  • VSCode[5]
  • Vim / Neovim Vim/Neovim[6]
  • Emacs[7]
  • Acme[8]
  • Sublime Text[9]
  • Atom[10]

玩转 VSCode 的文章会详细介绍在 VSCode 中使用 gopls。同时,后续在 VSCode 开发其他语言项目时,也会介绍相应语言的 LSP。

参考资料

[1]

#32394: https://github.com/golang/go/issues/32394

[2]

#35721: https://github.com/golang/go/issues/35721

[3]

#29202: https://github.com/golang/go/issues/29202

[4]

#32877: https://github.com/golang/go/issues/32877

[5]

VSCode: https://github.com/golang/tools/blob/master/gopls/doc/vscode.md

[6]

Vim / Neovim Vim/Neovim: https://github.com/golang/tools/blob/master/gopls/doc/vim.md

[7]

Emacs: https://github.com/golang/tools/blob/master/gopls/doc/emacs.md

[8]

Acme: https://github.com/golang/tools/blob/master/gopls/doc/acme.md

[9]

Sublime Text: https://github.com/golang/tools/blob/master/gopls/doc/subl.md

[10]

Atom: https://github.com/golang/tools/blob/master/gopls/doc/atom.md

    推荐阅读
  • 吃螃蟹搭配什么比较好(又到吃螃蟹季节)

    故而,螃蟹的鲜腥与黄酒甜香乃是绝配。过多动物蛋白质增加肾脏负担,对孕妇并无益处;另一方面,对胃酸不足,消化吸收功能较差的孕妇,吃大量海鲜河鲜后容易出现腹痛腹泻甚至严重脱水的情况,对保胎不利。老年人因消化系统脏器功能衰退,消化吸收能力差,故吃蟹应以品尝为主,不宜多食。如果在吃螃蟹后,患者出现泻肚、起疹子,应及时就医。

  • 冬天怎么快速减肥(冬天怎么减肥好)

    下面希望有你要的答案,我们一起来看看吧!冬天怎么快速减肥冬天减肥最快的方法还是要合理的控制饮食,也就是注意不要吃一些热量高的食物,尽量清淡饮食,然后加强运动锻炼,可以选择进行跑步或者是跳绳或者是跳舞等等,主要是消耗身体的热量才能够达到减肥的作用,平时可以适当的多吃一些西红柿,黄瓜,或者是苹果一类的有利于减肥的食物。同时也可以配合进行身体的按摩或者是针灸等方法,也可以适当的喝一些减肥茶。

  • 活着是为了知道为什么活着(用死亡表现对生的渴望)

    福贵一生经历了所有至亲的死亡。更为讽刺的是,县长还是福贵之前有恩于他的人。有庆的死正是小说中“死”的高潮,之所以有庆的死是高潮,有其深刻的原因。余华安排年幼的有庆被抽血致死,正是为了讽刺当时的社会实质。昨晚九点左右,福建莆田仙游县枫亭镇和平村一超市发生命案,现场发现有10名群众被刺,其中2人当场死亡,1人经抢救无效死亡,另外7名伤者经医院抢救暂无生命危险。

  • 网易新闻你的IQ还好吗测一测彩蛋答案

    网易王三三的吉祥物是很有标志性的,但是大家看图,是不是一脸懵比啊,怎么才能拼出一个王三三呢?哈哈哈竟然还有认输,不,嗨客的读者绝不认输!这是一个一堆线条,需要用手指两个指头缩小,直到最小,会露出王三三的轮廓,王三三就出现了,过关!赶紧去试一下吧,关注嗨客站的朋友IQ可是200起跳呢~

  • 微信和支付宝互转的平台(微信与支付宝终于实现互转)

    在如今这个电子支付横行的时代,微信、支付宝成为人们消费支付的必需品。支付宝与微信都各有优势,并且拥有着各自的用户,彼此之间在相辅相成中共同发展为人民群众提供着便利。但是有一个问题一直被大家诟病,那就是微信和支付宝不能够互相转账。微信和支付宝二者都是支付机构,同属三方支付平台。香港金融管理局宣布正式启用香港快速支付系统“转数快”,只需要电话号码或是Email地址便可以实现转账,支付宝与微信之间也可以通行。

  • 苏州链家租房中介费收费标准(租房攻略如何检查你的房间有无摄像头)

    找房的烦恼确实溜烟而去,但大家也不要忽视房屋的隐私安全问题。由此,在我们入住房屋时检查房屋的隐私安全成为一个必选项!当我们在规避摄像头偷拍风险的同时,也应学会用摄像头保护自己。作为孤身在外租房的人群,我们可以选择从正规渠道购买摄像头,安装在自己租住的房屋内,来时时监测自己所处环境的安全性。当然,我们在安装摄像头时,要避开隐私区域,不要正对卧室、浴室等。

  • 新农合社保卡怎么交费(新农合社保卡交费方法)

    我们一起去了解并探讨一下这个问题吧!新农合社保卡怎么交费打开手机上的微信,点击“我”。在页面右侧点击“下箭头”切换城市,需要注意这里某些城市还没有社保医保缴费功能。切换到我们本人所在的城市,点击“社保医保”进入。输入本人的身份证号,勾选“同意服务协议”。最后一步缴费就可以了。点击“保存缴费信息”,缴费即可。

  • 和前任互撕有什么后果(发圈辱骂曝光隐私)

    公民的人格尊严受法律保护,禁止用侮辱、诽谤等方式损害公民的名誉权。因当事人具有明显的主观过错,满足了侵犯名誉权的构成要件,构成侵害名誉权的行为。对于此类行为,侵权者可能要承担公开赔礼道歉、赔偿精神损害抚慰金等法律责任。此类行为,因未经过本人同意,擅自公开他人的手机号码,则侵犯了李女士的个人信息权,侵权者可能要承担损害赔偿等法律责任。

  • 哪个电视台养生节目最好(也许不值得庆贺)

    2016年,国家新闻出版广电总局规定,医疗养生类广告,播放时长不得超过1分钟,且不得以任何节目形态变相发布,也不得以电视购物短片广告形式播出。针对养生节目的乱象,2014年10月,国家新闻出版广电总局颁布《关于做好养生类节目制作播出工作的通知》。工作人员在老年产业博览会现场派发宣传资料。

  • 天麻加三七的功效(天麻加三七的功效有哪些)

    以下内容希望对你有帮助!天麻加三七的功效天麻可以祛风散寒、明目止痛、降血压,而三七有活血化瘀、消肿止痛、补气止血的功效;两者一起吃对于一些血瘀、血虚肝风内动的情况下有效。一起吃有平肝息风的作用,用来治疗偏头痛,而且可以用来预防心脑血管疾病的发生,但必须在中医指导下服用,否则会影响药物效果,还会产生不良反应。