Cursor光标定位类无法跳转的问题求解
耐心解决问题。
之前对开发运行环境不甚上心,只要配置能用就行,但是遇到问题仍然犯难。耐心解决了一个问题,记录一下。
问题
-
Cursor 点击类,无法跳转。
-
查看接口实现,找不到实现类。
总之,Golang 的接口、类、方法的实现和关联都是找不到的,无法跳转。这基本上就废掉了 IDE 的两条胳膊和两条腿了。没法用。
这个图是完成后截的。没截之前,下划线是没有的。
求解过程
咨询 deepseek ,有如下可能原因:
-
项目代码没有建立索引。
-
Language Server 没启动。
-
代码导航扩展插件没有启用。
其它原因暂时忽略,可自行查看 deepseek 提示。
排查索引问题
Cursor -> Preference -> Cursor Setting -> Feature
已建立索引。删除后再重建索引,仍然不行。
排查 Language Server 问题
问题:Cursor 依赖 LSP(如 TypeScript、Python、Go 等)进行代码跳转,如果 LSP 崩溃或未启动,导航会失效。
解决方案:
-
打开命令面板 (Shift + Command + P) → 输入
Restart Language Server
并执行。 -
检查右下角状态栏,看是否有 LSP 错误提示(如
⚠️ TS Server Error
)
查看和编辑 go 的各种配置,语言配置,仍然不行。
执行 Restart Language Server ,报
[warning] Language server is disabled
间接原因是 : Installing golang.org/x/tools/gopls@v0.18.1 FAILED,报错如下:
需要 go1.23.8 。
之前到这里就没法进行了。因为项目中用的是 1.22.5,如果改成 go1.23.8,gofmt 的内容可能会不一样, 改动可能较多,对团队提交代码不好。 迟疑再三,之前没有解决。但是这个问题不解决,就没法用 Cursor 了。这么个香饽饽不用太可惜了。
看到 deepseek 说可以用 alias go=go1.23.8 临时切换到 go1.23.8 版本,心动了。于是先下载。
代理配置
我的初始配置是这样。
试着改了下 GOSUMDB = "on",然后执行报错:
这可难倒我了。之前按照公司配置能用就可以了,也没怎么关注 go 环境配置。这次怎么也得搞定吧。
GONOPROXY, GOPROXY 这些配置是干啥用的呢?咨询 deepseek ,大意是说,GONOPROXY, GONOSUMDB, GOPRIVATE 是模块不要经过官方库校验,适用于公司私有库, GOPROXY, GOSUMDB 则是公共的。之前我的配置是 GOSUMDB = "off", GOPROXY 也写的是私有库。
我躁得大拍了几下桌子!怎么办? 公司 VPN 连着的啊。私有的不改,公共的先用官方试试吧。于是遵照 deepseek 改成如下:
执行后,看上去执行成功了。然后再切换 go 版本,报错: command not found。
怎么回事,go1.23.8 不是安装了么? 怎么没了,咨询 deepseek,发现 go1.23.8 是安装了的。
使用 ls $GOPATH/bin/go1.* 查看 go1.23.8 路径,确定也是可执行的。可为啥 go1.23.8 还是找不到呢?只好 unalias go 先切回去。用全路径试了试,是可以的。突然想到,嗯,go1.23.8 的路径得配置到 PATH 变量里。编辑 .zshrc 加进去,就可以了。
最后,再执行 Restart Language Server。 可以了。查找接口的实现类也可以了。
欧耶(o)/
回顾总结
-
go 的重要配置: GOPROXY, GOSUMDB, GONOPROXY, GONOSUMDB, GOPATH, GOROOT
-
学习一门新语言,一定要先弄清楚新语言的环境配置,否则后面会耗费更多时间。
-
使用 alias go 临时切换 go 版本, unalias go 去掉临时版本。
-
要耐心解决问题,有 deepseek 帮忙,总可以解决的。
AI 好好用
昨天一位公司同学分享了 Cursor 的一些用法和demo,深有启发。用 Cursor 连接 K8S 集群,完成各种配置和排查问题操作,太6了。写代码只是一个简单的应用,要是能与上下文语境建立连接,那真是太强大了。就像一个中央控制台,可以接入各种环境,处理各种数据。理论上, AI 至少能将编程相关的事情全部自动化。
用 AI 写代码
用 AI 写代码,对于程序员可以说是 AI 的一个基本使用场景。
使用好 AI 的要点:明确语境、结构化详细描述要求。AI 奉行原则是“不说就不给”。不明确语境,AI 会天马行空,不明确要求,AI 就只会给一个最多60分的答案。这60分里还有错误。这需要你具有辨别力。
不过提示词至少要达到合格水平,比如,写一段代码来说:
给定 XXX 结构体,使用 YYY 实现如下功能(必要可以给出方法签名),要求良好的健壮性、高效、可维护性。并针对该函数写一个覆盖全面的单测,要求覆盖各代码分支,覆盖正常、空、临界、异常情况。单测具有可扩展性,可任意添加新的测试用例。
再给一个比较复杂的例子:
分析 go 项目中的 DO 类,生成 PostgreSQL 的创表语句。AI 可以一次性生成可执行的程序。这里根据 AI 的输出,可以优化提示词,比如对枚举的处理,AI 无法识别,我就告诉他项目中的枚举长什么样子,它才能识别。
写一个 go 程序,遍历指定 Go 项目的多个 models 子包的 DO struct 类,根据 DO struct 类定义的字段、字段类型、TableName 方法,创建对应的 PostgreSQL 表。
(1) go 项目路径是 /Users/qinshu/workspace/goproj/service-ids2, 项目路径下有多个 models 子包。
(2)表名是 TableName 方法 的返回值,
(3)字段名是 字段上的 bson 注解值,ID 字段名在 PostgreSQL 为 id
(4) 如果 DO 字段类型为枚举,则解析该枚举的值并创建对应的自定义枚举,并在创表语句中引用,枚举定义在项目的多个 constant 子包的 go 文件里。不确定时使用 VARCHAR(255)
(5)go 字段类型与 PG 数据类型的对应关系如下:
primitive.ObjectID UUID PRIMARY KEY DEFAULT gen_random_uuid()
string VARCHAR(255)
bool BOOLEAN
int8, SMALLINT
int16 SMALLINT
int INTEGER
int32 INTEGER
int64 BIGINT
float64 double precision
[]string VARCHAR(255)[]
[]int8 SMALLINT[]
[]int16 SMALLINT[]
[]int INTEGER[]
[]int32 INTEGER[]
[]int64 BIGINT[]
map JSONB
time.time TIMESTAMP WITE TIME ZONE
BinData BYTEA
(6) 字段类型为 结构体指针的,对应 PG类型转为 JSONB; 字段类型为结构体指针数组的,对应PG类型为 JSONB[]
字符串统一 VARCHAR(255),如果是长 JSON,则需要用 TEXT。
注意:这里枚举的处理要对 AI 说清楚。入侵是采用这种形式。
AI 辅助软件开发
代码生成与CR
重点:明确语境,详述要求。必要可指定签名。
给定 XXX 结构体,使用 YYY 实现如下功能,要求良好的健壮性、高效、可维护性。并针对该函数写一个覆盖全面的单测,要求覆盖各代码分支,覆盖正常、空、临界、异常情况。单测具有可扩展性,可任意添加新的测试用例。
给定如下模板代码,要求对 XXX 生成类似的代码。模板代码要体现出多个代码段的关联。
使用python 实现如下功能。(临时工具)
• 生成通用函数并生成单测
• 根据代码样例或模板生成最终代码
• 模板代码补全
• AI code review
• 核心代码纠错和改进建议
• 工具类生成
• 临时程序生成
• 实用小工具生成
技术方案
实现 XX X 有哪些技术方案,各自优缺点?
做XXX 有哪些库和框架?各自优缺点及适用场景。
• 寻求技术思路: 有哪些常见方案?
• 深入探索技术方案:有哪些重要考量?
• 技术方案分析:各种方案优缺点利弊
• 技术选型建议:适用场景
知识检索
XXX 里如何创建对象?
给几个 YYY 的示例。
• 学习新语言
• 学习API
• 学习新技术(需要书籍建立系统化认知)
问题诊断
如下代码为什么报错 XXX,如何纠正。
XXX 超时有哪些原因。
• 代码问题诊断
• 问题原因分析
技术知识还有多大用处
AI 时代,技术知识是必需但不是最重要的。理解原理机制,具备优秀的综合分析能力是基本优势。再加上优秀的共情能力、明辨能力、决策能力,善用AI ,就具有更强的适应力,是未来生存最重要的核心能力。正所谓以不变应万变。
知识都会过时失效,技术知识尤其如此。因此学习重心一定不要放在技术知识上,更不要死记硬背,那是没有出路的。学习重心要放在理解能力、分析推理能力、实践能力上。现在知道一点东西,在将来是没有什么优势的。