Go 代碼審查提示詞(慣用寫法、錯誤包裝與 errors.Is / As、接口設計、命名與包結構)
從其他語言轉到 Go、寫出來的代碼「能跑但不像 Go」,或者團隊想統一 Go 代碼風格時用:讓 AI 按 Go 社區的慣用法審查代碼,重點看錯誤處理、接口放在哪裏、零值可用、包的組織方式,並給出改寫後的代碼。
通用大模型 對話模型通用
你是一名資深 Go 工程師,熟悉 Effective Go、Go Code Review Comments 中的慣例。請審查下面的代碼,指出「不夠 Go」的地方。 - 代碼用途:[代碼用途](例:訂單服務的倉儲層) - Go 版本:[Go 版本] - 作者背景:[作者背景](例:從 Java 轉過來) - 代碼: [粘貼代碼] 審查維度(只報告實際存在的問題): 1. 錯誤處理: - 錯誤是否被忽略;是否在同一個錯誤上既記錄日誌又返回(導致重複記錄); - 包裝錯誤時用 %w 保留原錯誤並加上上下文;判斷錯誤類型用 errors.Is 和 errors.As,而不是比較字符串; - 哨兵錯誤與自定義錯誤類型的選擇;錯誤訊息小寫開頭、不以標點結尾; - 不要用 panic 處理正常的業務錯誤。 2. 接口:接口由使用方定義而不是實現方;接口盡量小;函數參數接受接口、返回具體類型;不要為了「將來可能替換」預先定義只有一個實現的接口。 3. 命名:包名簡短、小寫、不重複包名(例如 order.OrderService 改為 order.Service);首字母縮寫保持一致大小寫;接收者名稱簡短且一致。 4. 結構與零值:結構體零值是否可用;不必要的構造函數和 getter / setter;指針接收者與值接收者的選擇是否一致。 5. 並發與資源:defer 關閉資源的時機、在循環中 defer 的問題、context 作為第一個參數傳遞。 6. 包結構:是否存在按技術分層的過度拆分(如每個類型一個包)、循環依賴的風險、internal 目錄的使用。 7. 其他:切片與 map 的預分配、字符串拼接、不必要的類型轉換。 輸出:問題表(位置 | 問題 | 慣用寫法 | 理由),以及改寫後的代碼。對有爭議、團隊可以自行約定的風格問題,標註「風格偏好,可選」。
高亮處換成你自己的內容:[代碼用途]、[Go 版本]、[作者背景]、[粘貼代碼]
ChatGPT Plus 充值
已被複製 0 次
使用說明
怎麼填變量:[作者背景] 寫上會讓審查更有針對性:從 Java 轉過來的常見問題是過度抽象和 getter / setter,從 Python 轉過來的常見問題是錯誤處理不嚴謹。
常見坑:
- 在實現所在的包裏定義一個大接口,再寫一個唯一的實現。Go 的習慣是讓使用方按需要定義小接口,實現方直接返回具體類型。
- 用
err.Error() == "not found"判斷錯誤,錯誤訊息一改就失效。用哨兵錯誤加 errors.Is。 - 每一層都
log.Println(err)然後return err,同一個錯誤在日誌裏出現好幾次。要麼處理並記錄,要麼加上上下文返回。
追問技巧:追問「根據這次審查的問題,整理一份團隊 Go 代碼規範(10 條以內),並推薦能自動檢查其中哪些規則的 lint 工具」。
示例輸出
示例,僅供參考(節選)
| 位置 | 問題 | 慣用寫法 |
|---|---|---|
IOrderRepository | 實現方定義接口,且只有一個實現 | 刪除接口,導出具體類型;需要測試替身時由使用方定義小接口 |
GetOrder() 第 18 行 | 用字符串比較判斷「未找到」 | 定義 var ErrNotFound = errors.New("order not found"),用 errors.Is 判斷 |
order.OrderService | 類型名重複包名 | 改為 order.Service |
go
var ErrNotFound = errors.New("order not found")
func (r *Repo) Get(ctx context.Context, id int64) (*Order, error) {
var o Order
err := r.db.QueryRowContext(ctx, `SELECT id, status FROM orders WHERE id = ?`, id).Scan(&o.ID, &o.Status)
if errors.Is(err, sql.ErrNoRows) {
return nil, ErrNotFound
}
if err != nil {
return nil, fmt.Errorf("query order %d: %w", id, err)
}
return &o, nil
}同款作品
用這條提示詞做出來的作品;原作者會因此獲得積分
還沒有同款,來做第一個。


0 條評論
還沒有評論,來搶沙發~