一直用的都是 goland/idea 写 go ,体验了下用 vsocde 开发 go ,结果发现怎么连最基础的补全功能都这么差
有点无法理解说 vscode 写 go 的体验和 goland 差不多的是认真的吗。。。。。
下面是一个简单到不能再简单的的例子,如果是我用 vscode 姿势不对,希望有人能指出问题所在
go mod 初始化好项目用 vsocde 打开(确保 gopls 的 lsp 已经正确运行),写一个 utils 包 utils/utils.go
,内容如下:
package utils
func ThisIsMyHelperFunction() string {
return "hello"
}
关掉这个文件的标签页,打开 main.go ,输入 ThisIsMy
,我自然期待补全会给出对应的函数候补,结果 vscode 根本跳不出任何候补。不是,vscode 这么离谱的吗
然后我发现,把utils.go
文件作为非活动标签页打开在边上,然后再输 ThisIsMy
,这次候补里出现了,但是它只是作为一个纯字符串出现,vscode 甚至都无法识别出它是个函数,tab 上去之后 ctrl + . 甚至都没法正常导包,提示不存在定义
然后翻了半天 vscode 官网,才发现说明有这一句
As you type in a Go file, you can see IntelliSense providing you with suggested completions. This even works for members in current, imported, and not yet imported packages. Just type any package name followed by ., and you will get suggestions for the corresponding package members.
不是,你的意思是我要用一个类型 or 函数之类的,必须从所属的包开始输入吗?一个项目复杂起来,那么多目录那么多包谁能清楚记得要用的东西在哪个包啊。。。。。。
而与之相对的,在 goland/idea 中写 go 项目,我只要输入 ThisIs 就能跳出对应内容,tab 后就直接完成了补全+添加包前缀+自动 import 。我曾经以为这种功能甚至是基础到不能再基础的功能,结果没想到。。。。
![]() |
1
maxwellz 15 天前
|
![]() |
2
kdwnil 15 天前
没出现补全是因为 utils 这个包没被 main.go 导入,导入了以后就能正常补全了
|
3
LeeEnzo 15 天前 ![]() 这跟 vscode 没关系,code 就是个编辑器又不是 IDE
体验不好时 Go 插件的锅,Go 插件是 Go Team 做的 |
![]() |
4
Vegetable 15 天前
谁知道你要给包起什么别名?这功能是 gopls 提供的,是 golang 的官方工具,别和 vscode 绑定吧
|
![]() |
5
peteretep 15 天前
老生常谈了,
vscode = 编辑器+增强 <<= jetbrains = ide + 增强 |
![]() |
6
BeautifulSoap OP @kdwnil 那么请问,当第一次在 main.go 中使用 utils 的时候怎么导入 utils ?手动移动到文件代码最上面 输入 `import "xxxx/utils"`?还是按照文档说的,通过输入包名+ . 来引用?
于是问题就回到了我帖子里说的 > 一个项目复杂起来,那么多目录那么多包谁能清楚记得要用的东西在哪个包啊。。。。。。 |
![]() |
7
Trim21 15 天前
go 的 lsp 是 golang 自己写的...
所以盲猜这里也是为了代码写起来简单才选择这么实现的。这么做的话就不用搜索当前 go.mod 列出的全部包的导出符号,只需要搜索当前已经导入的包里存在的符号就可以了。 |
![]() |
8
lepig 15 天前 ![]() 他只是个编辑器,别为难他了
话说,一直用不习惯 vscode ,还是 JB 好用。开箱即用,不用配这个配那个,省心。 内存大点就大点吧,老了,折腾不动了 |
![]() |
9
bruce0 15 天前
我也是用不惯 vscode(也可能是我不会用) 写 go 一直用 goland,写 cpp 用 clion,但是 jb 家的远程开发太弱鸡,我想用 vscode 远程到 Debian 上写 cpp,但是一直没弄好环境,体验有点差,clangd 装了,提示不太行,想要断点 debug,好像还要自己写一个配置文件, 被 ide 惯坏了🤣
|
![]() |
10
kdwnil 15 天前
@BeautifulSoap #6 就按照文档的来,第一次输 包名+. ,只有第一次需要,之后这个文件调用这个包底下的所有 变量/常量/函数... 都能正常补全了
……当然啦如果这点就忍不了,我也不建议继续用 vsc 写 go ,不然到项目稍微大了点等 gopls 那超长的缓存耗时的时候 op 你更忍不了(你猜我现在为什么那么有空在回 v2 ?) |
![]() |
11
BeautifulSoap OP ![]() |
![]() |
13
BeautifulSoap OP @kdwnil 所以问题还是那个啊,我现在的开发体验如下了:要用一个东西,输入名称发现没有补全,然后全局文本搜索,找到它属于哪个包,然后再 `包名.函数名` 导入。尤其一个文件里用到一堆包的时候。我要不停去全局搜
|
![]() |
14
woodfizky 15 天前
要不然为啥 JetBrains 是收费的呢?
不过 JetBrains 有时候会过度设计。 比如你说的这种自动补全,我用的 Pycharm ,新版本,自动补全甚至能帮我在没 import 对应包的时候,自动帮我 import 那个包,然后我发现错了,手动删掉那个包的话,自动添加的 import 语句是不会帮我再删掉的。 虽然 ctrl + alt + o 能自动帮我优化 imports 吧,但是有时候忘记了,commit 的时候带着一个没用过的 import 语句,就很难受,有时候那个 import 的文件有问题还会报错。 |
15
concernedz 15 天前
我也用不惯啊,但是为了用 cursor 硬是继续使用,快捷键装插件好适应,但很多挑战,接口实现都找不到,很难受
|
16
coolcoffee 15 天前
vscode 轻的代价是懒,就像写 html 的 emmet tab 按键补全,只有刚写完那会按 tab 键会自动生成标签,光标移走再回来又变成了 tab 符号的输入。
像 Jetbrain 系每个项目打开都要索引一遍, 内存管够所以才有像 ElasticSearch 全文搜索毫秒级别的响应。 |
17
concernedz 15 天前
@concernedz 挑战->跳转
|
![]() |
18
mainjzb 15 天前 ![]() 从 goland 跳到 vscode 大概 2 年了,总体来说确实差不多,有些小问题习惯了。(毕竟免费啊~
楼主说的这个问题确实存在,研究了 10 分钟没有解决方案 平时使用我没感受到,因为我习惯于记住“包名” 而不是“函数名” 在楼主这种情况下,我会直接输入 utils. 等待提示后,在提示框里选一个函数。 或者更名明确的情况下,比如要切割字符串,那我会输入 stings.sp 然后按下“Tab 键” (不需要在文件头里手动导入包 总结来说确实记住了包名。(但是我想,比起函数名,包名应该更少吧 |
![]() |
19
woodfizky 15 天前
#14 另外 JetBrains 远程开发好像确实不如 VSCode ,这点反而有点不应该。
|
20
concernedz 15 天前
真的想找一个,有 goland 丰富的功能的 AI 编辑器,jb 家的 git 又好用,偏偏 ai 时代他不争气,用了很多插件,tab 补全离 cursor 差太多了
|
21
Yadomin 15 天前 ![]() 不同的 LSP 实现不一样,比如我用 clangd 写 cpp ,就经常帮我 xjb include
|
![]() |
22
kdwnil 15 天前
@BeautifulSoap #13 这个就各有取舍了,我个人选择 vsc 开发主要是要用 vsc-remote ,jetbrains 的远程开发什么情况大家都懂。另外跟站里很多人不同,我其实不太喜欢 jb 的 git 功能,太复杂了,不如 vsc 一路点加号。另外 jb 今年也不给开源项目续开源授权我也没得用。
不过说实话这些跟 go 开发关系都扯远了 |
![]() |
23
UnluckyNinja 15 天前 via Android
@coolcoffee #16 光标移动后 tab 就应该是输入制表符,你说的其实是 ctrl+space 重新唤起 intellisense ,在这个状态下 tab 才是补全功能(输入字母时自动切换到这个状态)。否则的话你想插入制表符时变成补全,岂不是更反直觉?
|
![]() |
24
crossoverJie 15 天前
我选择使用 idea 配合其他语言的插件,少安装几个 App 也能实现 90% 的功能了( Python 、Go 都是这么玩的)。
|
![]() |
25
woniu7 15 天前 ![]() v2 还有人说他是秦始皇呢
做的不算差吧,反正我就用 gopl 开发,没用过 golang 。可能是因为你降级体验。 你 golang 这方面效率确实高,工具那不是看人嘛,cursor 某些方面效率不是爆你 golang 。 你记不住包名却记得住精确的函数名么,项目大了你的模糊函数名太多了呢,还有解析项目耗时和内存消耗,都是要权衡的,这是 gopl 的决定,作为 go 开发者觉得免费的 gopl 并不是不能用。 |
26
mkfoy 15 天前
哥, 创建一个 mod 文件吧。 就有了。
|
![]() |
27
archxm 15 天前
我最近几年一直 vscode ,感觉还好吧。
以前 goland 也用了一年。没发现有啥特别大差别。 |
![]() |
28
Vegetable 15 天前
@BeautifulSoap 找 symbol 不需要文本搜索,可以使用 ctrl+t 开启工作区符号搜索。
|
29
xuhuanzy 15 天前 via Android
我正在做 lualsp ,vscode 不背这个锅,这是 lsp 实现问题,jb 家付费的功能更完善合情合理。
|
30
deplives 15 天前
不是,vscode 就是个编辑器,就跟 vim 似的,不是 ide ,功能都靠插件扩展,这也能怪 vscode ??
|
31
xuhuanzy 15 天前 via Android
这个功能实现非常简单,遍历所有 function 符号就行了,不做纯属开发者的取舍问题,你可以花点时间分叉一个更符合 goland 使用习惯的 lsp 。
|
33
coolcoffee 15 天前
@UnluckyNinja 我觉得需要思考重新唤起 intellisense 就是在偷懒,对于我是想要光标在某个位置产生的预期行为是一致的。
就像现在 vscode 还是没办法做到编辑 xml 、html 标签流畅的成对修改,这个十年前的 JB IDE 就已经能支持了。哦不对,现在 vscode 编辑 xml 是会提示再多按一次回车,但是如果删标签名字就不会提示,需要手动改两次。 |
34
Rickkkkkkk 15 天前
只能说 goland 好用。
|
35
yulon 15 天前
你直接写 utils. 就会自动导入包,或者写个 u 就会列出一堆候选,直接写没导入的包的函数名谁懂啊。。。
|
![]() |
37
BeautifulSoap OP @kdwnil jb 家的远程开发扶不起的刘阿斗我也气啊。其实 jb 的 git 功能我从来不用的,一直都感觉非常不直观提交日志也感觉非常乱,只有处理冲突的时候我才觉得好用。平时我都是用的 lazygit 好处就是无论再哪个服务器上都能直接用不依赖 gui ,然后要做更复杂的 rebase 之类操作的时候切到 fork 的 gui
|
![]() |
38
ns09005264 15 天前
gopls 有这个直接写函数,然后提示都有哪些包有这个函数,选择后自动导入包的功能的。我用 helix+gopls 就可以这样。
不知道你的 vscode 哪里出问题了,我记得 vscode 能正常提示来着。 |
39
ninjashixuan 15 天前
人收费那么多年肯定牛逼的地方,只是现在 jb 家 ai 功能跟不上,相对而言这点小瑕疵 ai 功能能节省更多时间。
|
![]() |
41
Meld 15 天前
|
![]() |
42
BeautifulSoap OP @woniu7 其实 goland 这一套习惯了的话记函数名、类型名会比记包名心智负担更低点
因为变量、函数等名称基本都是按照功能命名的,当要用到对应的东西的时候,只要回忆起几个关键字就能直接候补出需要的东西 以我这个帖子为例,我只要直接模糊地输入 ThisFunc ,就能直接候补就出 `ThisIsMyHelperFunction` 哪怕我都不记得这个函数完整叫什么 更实际点的就是我写了个 DumpAllMembers 函数,然后想用,那么我只要输入 DumpMem 就能靠着关键字把要的东西 import 进来了 |
![]() |
43
quqiu 15 天前
啊原来 goland 的补全可以这样,我一直用 vscode 可能已经习惯以包名开头了。
|
![]() |
44
MYDB 15 天前 via iPhone
工具而已,这个功能他有,那个功能她有,你为什么要在他和她都看不到的论坛吐槽?
|
![]() |
45
iyaozhen 15 天前
|
46
codersdp1 15 天前
vsc + ai 才有一战之力,不然就 goland
|
47
Leviathann 15 天前 ![]() 吹的时候就是完全可替代
问题摆脸上了就是“就是个编辑器”是吧 |
48
kevinxzhao 15 天前
当然“必须从所属的包导入”,vsc 只是一个编辑器。
|
49
hxy100 15 天前
需要装对应插件的吧,你用光秃秃的 VSC 自然好用不到哪里去
|
50
LawlietZ 15 天前
你要的这些功能,vscode 的一个分支 cursor 都能满足
|
51
z1829909 15 天前 via Android
@yulon 如果是 goland ,直接输入方法名字,会模糊匹配符合条件的,回车之后会自动加入 import ,这个很好用,因为我只需要知道包名或者方法名其中之一就可以快速找到他。
|
![]() |
52
UnluckyNinja 15 天前 via Android
去试了一下,确实不行,顺便提一下 ts 的 intellisense 是会建议所有已导出函数的,甚至连依赖模块中的也会一并列出,补全后自动添加导入。
这个应该是扩展/语言服务器自己的选择,至于为什么 go 就必须先写一次包名而 ts 能做到,我建议直接到官方扩展 repo 提 issue: https://github.com/golang/vscode-go 看看到底是扩展还是语言服务器问题,能不能改进 |
![]() |
53
chaleaochexist 15 天前
|
![]() |
54
chaleaochexist 15 天前
@chaleaochexist 我说错了. 当我没说. 楼主你得对的.
|
55
lovelylain 15 天前 via Android
难怪用 goland 感觉比 vscode 卡,原来是要支持无视包空间全局联想函数名,有得有失嘛
|
56
haaro 15 天前 ![]() vscode+github copilot plugin 写 go 还是很舒服的
|
57
caiqichang 15 天前
|
![]() |
58
Biem 15 天前
像我这种 go+py 的项目好像只有 vscode 是能一起写的了。。。不过现在的 ai 插件索引项目文件夹后,提示对我来说还是凑合够用了
|
59
DefoliationM 15 天前
算了吧,当时就是因为 goland bug 太多,还特别能吃内存才换成 vscode 的。
|
![]() |
60
donk68 15 天前
cursor 吧
|
61
bouts0309 15 天前
我记得说是 goland 用的自己的 language server ,不使用 gopls ?
反正我也是 vscode(cursor)写 go 的时候提示啥的太慢了,回去继续用 goland 的 |
62
HappyAndSmile 15 天前
免费的才是最贵的,我用了 7 年以上的正版 Goland 了,我根本不相信 VS Code 可以平替
|
![]() |
63
zaunist 15 天前
不至于吧,我用的时候提示啥的还是挺好用的,你没装 gopls 吗,装了的话,没记错默认用的微软的 lsp ,我感觉挺好用的。离线环境下 jb 家的产品非常好使(代价是每次启动 index 就要等好久。。。),但是联网的时候我觉得两者用起来差不多。
|
64
pinecone1 15 天前
在用 cursor 写 go
很多时候都不用写个开头 你按个回车新开一行 编辑器就猜出来你打算写什么了。。。就挺离谱的 |
![]() |
65
proxytoworld 15 天前
@pinecone1 那是 ai 猜的,不是 cursor 干的
|
66
jheroy 15 天前 via iPhone
确实是你没用对,gopls 补全是可以设置补全未 import 的包的。
|
![]() |
67
duanzhanling 15 天前
哈哈,我就是围观下
|
![]() |
68
kuanat 15 天前
我认为是 vscode 的锅,因为我的印象里这个功能 gopls 很早就有了,不过我现在主力是 neovim ,待我验证一下。
|
![]() |
69
Xinu 15 天前
不光是 golang js 体验我都觉得不如 webstorm ,就追代码这个功能,实现的贼烂
|
70
jheroy 15 天前
gopls: Enabling the setting go.autocompleteUnimportedPackages used to provide completions for unimported packages.
|
![]() |
72
dragondove 15 天前
@jheroy 这个选项是默认启用的,我也试过手动启用了,还是不能这样补全,你可以试试
|
![]() |
73
songray 15 天前
@dragondove 因为这个设置不能搭配 language server 使用,具体的表述是:
Include unimported packages in auto-complete suggestions. Not applicable when using the language server. |
![]() |
74
tedzhou1221 15 天前
如果不是 cursor 我是不会用 vsc 这东西的。JB 省心省力。只是不省内存
|
![]() |
75
RedisMasterNode 15 天前
@kdwnil 要手输包名也太蠢了...只记得方法名关键词看来是不配用 vscode 了
|
![]() |
76
Mr54 15 天前
vscode 很多功能都是缺失的,写前端也是要安装很多插件
|
77
SummerAgain 15 天前
我也是 goland 的深度用户,但是也切换到 vscode 了,不过装了主题和快捷键映射等插件, 写在已经可以对 goland 脱敏了,代码补充的问题基本没遇到,go 的插件本身就能补充提示了,在装了通义灵码增强了一下,主要一个全免费,goland 里面有的功能 vscode 基本都有
|
78
pinecone1 15 天前
@proxytoworld 好用就完事了,我管它是哪个 app
|
79
jheroy 15 天前
@dragondove #72 我试了一下,vscode 里面, 如果实现没有 import 的包补全要在前面加包名(包名可以补全会自动 import 包), 如果已经 import 就可以直接补全函数而不需要包名。 估计是怕项目太大要整个项目查询比较耗时。
|
![]() |
80
kiwi95 15 天前
架不住 vscode 免费,插件多,重启速度快,远程开发流畅,goland 到 wsl 都卡的不行,这么多年都搞不好
|
81
zzhirong 15 天前 ![]() 我倒是感觉这样做挺好的?不然,项目小的话还好说,项目大的话,写个通用方法比如 New 那不得卡半天。
|
82
jorneyr 15 天前
你不能只有在吹 vscode 的时候才说它完全能平替 goland ,一遇到问题(尤其是补全这么基础直接影响体验的地方)就直接切割是 gopls 的锅:不意外,新能源汽车也是这种宣传风格,宣传时智能驾驶很牛逼,出问题后我们的只是辅助驾驶没那么牛逼。
|
83
chrosing 15 天前
|
84
magggia 15 天前
"一个项目复杂起来,那么多目录那么多包谁能清楚记得要用的东西在哪个包啊"
额,函数名都能想起来个关键字,用哪个包的想不起来吗?打个 ut 就能提示了吧,不然项目复杂起来类似函数名会很多,更不好区分了 |
86
zogwosh 15 天前
vscode 的语言服务器只有 ts 好用。
|
![]() |
89
1103409364 15 天前
写 rust 感觉还可以
|
![]() |
90
qloog 15 天前
以前也是用 goland, 更新到新版本后需要收费了,懒得折腾,现在基本是 vscode+ github copilot , 用起来很爽,开发 go, php, python, nodejs 都很方便,安装对应的 plugin 就可以了。
|
![]() |
91
davidqw 15 天前
VS Code 直接用 copilot 不好吗?免费代码补全,最近支持大模型 API 接入了
|
92
Joker520 14 天前
vscode 就是个编辑器,为啥老有人拿它跟 ide 比
|
![]() |
93
iyaozhen 14 天前
@tedzhou1221 gopls 大项目更耗内存,128GB 都不够用
![]() |
![]() |
94
PTLin 14 天前
楼主的这个问题不就单单只是 gopls 的问题吗。
为什么还有人说什么 vsc 就是个“editor”,不是 ide 。 25 年了,真的还有人认为 ide 就应该是 ide 的样子,editor 就是 editor 的样子吗,还有人认为 vsc 不是所谓的“ide”吗。 |
95
linanwy 14 天前
客观的来说,vscode 写 go 确实补全很差,其他大大小小的 bug 也多。但是 goland/idea 自己也有大大小小的问题,比如内存占用太高等。只是有的忍得了,有的忍不了,而忍得了和忍不了的又因人而异罢了
|
96
nickyadance23 13 天前
@Xinu #69 我就一直没搞懂 vscode 里怎么跟到三方库的代码,golang 里对着函数名一路点就行
|
97
jrqlxue 7 天前
1. 我自己常用的包,不在这个项目里,写函数名的一部分时大部分时候都能搜到,然后自动给 import ,当然更包括基础包了
2. 项目内新写的包没仔细试过,不过也可能习惯项目内用包名,然后根据提示选函数 3. 最近 vscode 特别卡,经常写代码刚写一个字符,然后卡死好久,或者卡顿出来首字母提示,之前的时候很丝滑,开 AI 辅助也没这么卡过 4. 之前用 goland ,切到 vscode 的时候总主观感觉没 goland 好用,大概 a. 变量提示、搜索和跳转的时候 goland 更完整? b. git 提交的时候,goland 功能更丰富,比如可以筛选提交修改的一部分行 |