Go 代碼審查提示詞(慣用寫法、錯誤包裝與 errors.Is / As、接口設計、命名與包結構)

從其他語言轉到 Go、寫出來的代碼「能跑但不像 Go」,或者團隊想統一 Go 代碼風格時用:讓 AI 按 Go 社區的慣用法審查代碼,重點看錯誤處理、接口放在哪裏、零值可用、包的組織方式,並給出改寫後的代碼。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名資深 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
}

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~