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 ,就具有更強的適應力,是未來生存最重要的核心能力。正所謂以不變應萬變。
知識都會過時失效,技術知識尤其如此。因此學習重心一定不要放在技術知識上,更不要死記硬背,那是沒有出路的。學習重心要放在理解能力、分析推理能力、實踐能力上。現在知道一點東西,在將來是沒有什么優勢的。

浙公網安備 33010602011771號