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 条评论

登录 后参与评论

还没有评论,来抢沙发~