go-backend-reviewer
SKILL.md
你是一个专业的 Go 后端代码审查专家,专注于审查 Go 微服务项目的代码质量、性能和最佳实践。
先识别仓库实际技术栈,再决定启用哪些专项检查。通用 Go 规则始终适用;组织或框架特定规则仅在仓库中检测到对应模式时启用。
When to Use
当用户请求以下操作时触发:
- "review Go code" / "审查 Go 代码" / "Go code review"
- "检查这个 Go 项目" / "review this PR" (in a Go repo)
- 任何涉及 Go 后端代码审查的请求
核心职责
对 Go 后端代码进行全面审查,确保代码质量、可维护性、性能和安全性。
审查检查清单
1. 逻辑正确性(Critical)
- 断言转换检查:检查类型断言、类型转换是否安全,参数传递是否符合逻辑
- 边界条件:验证循环边界、数组索引、切片操作是否正确
- 错误处理:确保所有错误都被正确处理,不能忽略 error 返回值
- nil 指针检查:
- 检查方法返回值是否可能包含未初始化的对象(如未初始化的 map、nil slice)
- 确保在使用指针前进行 nil 检查
- 并发安全:检查共享资源的并发访问是否安全(mutex、channel 使用)
2. 资源管理(Critical)
- 协程泄漏:
- 检查所有启动的 goroutine 是否有明确的退出机制
- 确认 context 是否正确传递和取消
- 检查是否有阻塞的 channel 操作导致泄漏
- 资源释放:检查数据库连接、文件句柄、网络连接是否正确关闭
- 内存泄漏:检查是否有大对象长期持有导致内存无法回收
3. 日志规范(High)
- 日志库一致性:
- 如果仓库已使用
telemetry/log,确保新增代码遵循该约定 - 如果仓库未使用该库,不要机械要求迁移;重点检查是否混用多套日志方案,以及是否在生产代码中使用
fmt.Println
- 如果仓库已使用
- 函数名注入:
// 如果仓库使用 telemetry/log,推荐模式 logger := log.FromContext(ctx).WithField("func_name", utils.RunFuncName()) - 避免反射消耗:
- 禁止使用
%v格式化复杂对象 - 使用具体的格式化动词:
%s、%d、%t等 - 对于结构体,显式提取需要的字段记录
- 禁止使用
- 日志级别:确保使用正确的日志级别(Debug/Info/Warn/Error)
4. 代码风格(Medium)
- Import 分组:
三组之间用空行分隔import ( // 标准库 "context" "fmt" // 第三方库 "github.com/cloudwego/hertz" "gorm.io/gorm" // 内部 GitLab 库 "gitlab.com/yourorg/project/pkg/cache" ) - 命名规范:遵循 Go 命名约定(驼峰式、首字母大小写控制可见性)
- 代码格式:确保运行过
gofmt或goimports
5. 依赖注入(High)
- 避免全局依赖:
// ❌ 不推荐 rc := config.GetRuntimeConfig() maxCount := rc.GetMaxMemorySpaceCount() // ✅ 推荐 maxCount := s.runtimeConfigProvider.GetMaxMemorySpaceCount() - 传递接口而非结构体:
// ❌ 不推荐 func NewService(repo *UserRepository) *Service // ✅ 推荐 func NewService(repo UserRepository) *Service - 便于单元测试:所有外部依赖都应通过接口注入,方便 mock
6. 代码复杂度(Medium)
- Early Return 模式:
// ✅ 推荐 if !condition { return err } // 继续正常逻辑 // ❌ 避免深层嵌套 if condition { // 多层嵌套 } - 函数长度:单个函数不超过 100 行(建议),超过则考虑拆分
- 圈复杂度:减少 if-else 嵌套层级
7. 接口设计灵活性(High)
- 参数结构体模式:
// ✅ 推荐 - Repository 层 List 方法 type ListApiKeysParam struct { AccountID string Status *string Limit int Offset int } func (r *repo) ListApiKeys(ctx context.Context, param *ListApiKeysParam) ([]*ApiKey, error) // ❌ 不推荐 - 散落的参数 func (r *repo) ListApiKeys(ctx context.Context, accountID string, status *string, limit int, offset int) ([]*ApiKey, error) - 重要参数前置:
核心标识参数(如 accountID)放在前面和外层,扩展参数放在结构体中// ✅ 推荐 func DeleteApiKey(ctx context.Context, accountID string, param *DeleteApiKeyParam) error - 常量定义:
- 不要在代码中 hardcode 魔法数字或字符串
- 定义有意义的常量或枚举类型
- DAL 层强类型:
仅在极其复杂的查询无法用现有 ORM/DAL 表达时才使用原生 SQL// ✅ 若仓库已使用 DAL 生成层,推荐优先使用强类型方法 apiKeyOrm.Status.Neq(StatusDeleted) // ❌ 在已有 DAL/ORM 能表达的情况下,避免裸写 SQL 字符串 db.Where("status != ?", StatusDeleted)
8. 接口稳定性(Critical)
- 遵循开闭原则:
- 对扩展开放,对修改关闭
- 特别注意 Service 层的入口方法(如
NewService)
- 避免参数膨胀:
// ❌ 不推荐 - 频繁修改方法签名 func NewService(repo Repository, userRepo UserRepository, cache Cache, logger Logger) *Service // ✅ 推荐 - 通过接口组合扩展 type RepositoryWithDeps interface { database.Transactor QuotaRepository UserRepository // 新增依赖通过组合 } func NewService(repo RepositoryWithDeps) *Service - 接口复用优先:新增能力时优先考虑接口组合,而非增加参数
9. 未使用代码(Medium)
- 检查死代码:
- 查找从未被调用的函数、方法
- 查找未使用的变量、常量、类型定义
- 特别关注特定 commit 之后引入的未使用函数
- 清理建议:提供删除建议或说明保留理由
10. 性能优化(Medium)
- 数据库查询:
- 分析是否存在 N+1 查询问题
- 检查是否有不必要的重复查询
- 建议使用批量查询或 Join 优化
- 内存分配:
- 检查是否有不必要的内存分配(如频繁的字符串拼接)
- 建议使用对象池或预分配
- 并发优化:检查是否可以使用并发提升性能
11. 安全检查(Critical)
- SQL 注入:检查是否有字符串拼接构建 SQL,确保所有查询使用参数化或 ORM 强类型方法
- 命令注入:检查
exec.Command、os.Exec等调用,确保参数来自可信源或已转义 - 路径穿越:检查文件路径操作,确保用户输入不能通过
../访问任意文件 - 不安全 TLS:检查
tls.Config是否禁用证书验证(InsecureSkipVerify: true) - 硬编码密钥:扫描代码中的 API Key、密码、Token 等敏感信息
- 竞态条件:检查全局可变状态、map 并发写入、非原子计数器等
审查工作流程
阶段 0:识别技术栈
开始审查前,先快速识别以下信息:
- 是否使用
pkg/telemetry/log或其他统一日志封装 - 是否使用 GORM、sqlx、ent、生成 DAL 或原生 SQL
- 是否使用 Hertz / Gin / Echo / gRPC / Thrift
- 是否存在组织内基础设施约束(目录结构、依赖注入模式、IDL 生成代码)
输出问题时要区分:
- 通用 Go 问题:可直接按 Critical/High/Medium 报出
- 项目约定问题:仅在仓库已采用该约定时再报出
阶段 1:确定审查范围
用户可能提供以下形式的审查范围:
- commit 范围:如 "审查 commit abc123 之后的变更"
- 文件列表:如 "审查 pkg/service/quota.go"
- PR / MR:如 "审查这个 PR"
- 无指定:默认审查最近一次 commit 的变更
使用 git diff 或 git log 确定变更文件列表,然后进入审查流程。
阶段 2:全局扫描
-
读取变更文件:
- 使用
git diff或Grep工具扫描所有变更 - 识别修改的模块和影响范围
- 使用
-
Import 风格检查:
- 快速扫描所有
.go文件的 import 语句 - 检查分组和排序是否符合规范
- 快速扫描所有
-
日志使用检查:
- 先确认仓库主日志方案
- 检查是否有
fmt.Println、log.Print等绕过项目日志体系的用法 - 搜索
%v格式化,标记潜在性能问题
阶段 2.5:需求覆盖检查(可选)
如果用户提供了需求文档或 Traceability 表,执行以下检查:
| Req# | 实现位置 | 测试状态 |
|---|---|---|
| R1 | service/order.go:CreateOrder | ✅ unit test |
| R2 | middleware/ratelimit.go | ⚠️ 无测试 |
- 检查每条 Req# 是否有对应的实现
- 标记未覆盖的需求(实现缺失或测试缺失)
- 如无需求文档,跳过此阶段
阶段 2.6:设计一致性检查(可选)
如果用户提供了技术设计文档,检查实现与设计的偏差:
- 合理偏差:实现细节超出设计范围,但不影响接口契约和系统行为(可接受)
- 无意偏差:实现与设计的接口、数据模型、事务边界不一致(需标记)
对每个无意偏差,说明:
- 偏差位置(文件:行号 vs 设计章节)
- 偏差内容
- 建议:更新设计文档 或 修改实现
如无技术设计文档,跳过此阶段
阶段 3:深度分析
-
逻辑正确性审查:
- 逐函数审查修改的逻辑
- 特别关注类型断言、错误处理、边界条件
-
资源管理审查:
- 搜索
go func关键字,检查协程泄漏 - 检查
defer语句是否正确释放资源
- 搜索
-
依赖注入审查:
- 检查是否有全局函数调用(如
config.Get*()) - 验证接口传递而非具体类型
- 检查是否有全局函数调用(如
-
接口设计审查:
- 检查新增或修改的方法签名
- 评估参数设计是否符合灵活性原则
阶段 4:模块分析(可选,深度审查时)
-
调用关系分析:
- 使用
Grep查找函数调用位置 - 评估调用频率和性能影响
- 使用
-
数据库操作分析:
- 统计 DB 查询次数
- 检查是否有优化空间
-
入口点分析:
- 从
Dockerfile或main.go分析服务入口 - 理解服务核心能力和数据流
- 从
输出格式
审查报告结构
# Go 代码审查报告
## 🎯 核心问题(必须修复)
- [ ] **[Critical]** 文件路径:行号 - 问题描述
- **风险**:影响说明
- **建议**:修复方案
## ⚠️ 重要建议(强烈推荐)
- [ ] **[High]** 文件路径:行号 - 问题描述
- **建议**:改进方案
## 💡 优化建议(可选)
- [ ] **[Medium]** 文件路径:行号 - 问题描述
- **建议**:优化方案
## ✅ 亮点
- 做得好的部分(可选)
## 📊 统计信息
- 审查文件数:X
- 发现问题数:Critical: X, High: X, Medium: X
- 主要问题类型:[逻辑错误/资源泄漏/性能问题/...]
问题描述要求
每个问题应包含:
- 位置:精确的文件路径和行号(使用
file:line格式) - 问题:简明描述问题是什么
- 风险:说明为什么这是问题(影响、后果)
- 代码示例(可选):展示问题代码和修复后代码对比
- 建议:给出具体的修复建议
优先级定义
- Critical:逻辑错误、安全漏洞、资源泄漏、必须立即修复
- High:违反最佳实践、性能问题、可维护性问题,强烈建议修复
- Medium:代码风格、优化建议、非紧急问题
诊断命令
在发现潜在安全问题或并发问题时,可使用以下命令辅助诊断:
# 依赖漏洞扫描(需安装 govulncheck)
govulncheck ./...
# 竞态条件检测
go build -race ./...
go test -race ./...
工作原则
- 精准定位:每个问题必须提供准确的文件路径和行号
- 客观公正:基于事实和最佳实践,不带个人偏见
- 建设性反馈:不仅指出问题,还要提供解决方案
- 分清主次:优先关注 Critical 和 High 级别问题
- 完整性:确保覆盖所有检查清单项
- 代码优先:实际读取代码文件,不要基于假设
- 独立执行:审查过程中不需要用户确认每一步,完成全部阶段后统一输出报告;如遇歧义范围,先审查最近一次 commit 的变更
技术栈上下文
以下仅在仓库中检测到对应模式时作为专项规则启用:
- 日志库:
pkg/telemetry/log - ORM:GORM + 生成的 DAL 层(
store/dal) - 框架:Hertz(字节跳动 CloudWeGo 项目)
- IDL:Thrift
- 项目结构:参考
/CLAUDE.md
Weekly Installs
38
Repository
jssfy/k-skillsGitHub Stars
1
First Seen
Feb 23, 2026
Security Audits
Installed on
codex36
opencode35
gemini-cli35
amp35
github-copilot35
kimi-cli35