检查 Go 代码的惯用模式、错误处理、并发安全性和常见错误。用于审查 .go 文件、检查错误处理、goroutine 等。
Go Code Review : Review Workflow. 遵循此顺序, 顺序为.是一项面向实际任务的技能,主要用于在下面的每个通道都满足之前不要发出结果;碱碱碱酸盐 mod – 打开 go.mod 并读取 go 指令;
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
请严格按以下**顺序**执行。在满足下方所有 **“通过(Pass)”** 条件前,**不得输出任何问题发现(findings)**。
基线 go.mod — 打开 go.mod 文件,读取其中的 go 指令。
通过条件:你能在审查前言或工作笔记中明确陈述该模块所声明的精确 go X.YY 版本号(例如 go 1.21)。仅当当前基线版本匹配时,才可应用对应版本限定的建议(如:Go < 1.22 时需注意循环变量捕获问题;Go 1.21+ 可用 slog/结构化日志;Go 1.20+ 可用 errors.Join)。
阅读上下文代码 — 对每个被修改的 .go 文件,须通读包含变更的完整函数或逻辑单元,而不仅限于 diff 片段。
通过条件:对每个被修改的文件,至少通读一个完整封闭的函数(或包级 init 函数 / 变量块),且该函数/块必须包含本次变更。
划定检查清单范围 — 判断哪些《审查检查清单》模块适用于本次 diff(如:错误处理、并发、接口/类型、资源、命名)。为适用模块加载对应参考文档;跳过与 diff 完全无关的模块。
通过条件:审查报告或工作笔记中须列出已应用的检查清单模块;对不适用模块,须标注 “N/A” 并附上一句紧扣 diff 的简要理由(例如:“变更中无任何并发逻辑”)。
报告前验证 — 加载并严格执行 review-verification-protocol(审查验证协议)。
通过条件:对拟报告的每一项问题,均须满足该协议中的报告前验证检查清单(包括:实际阅读了相关代码、核查了上下文、区分了“错误”与“风格差异”,等等)。
| 步骤 | 通过条件 |
|---|---|
| 1 | 在给出任何版本特异性建议前,已准确记录 go.mod 中声明的 go X.YY 版本。 |
| 2 | 对每个被修改的文件,均已通读其完整封闭上下文,而非仅看 diff。 |
| 3 | 适用的检查清单模块已明确列出,或标记为 N/A 并附有基于 diff 的简要理由;所需参考文档已按需打开。 |
| 4 | 对每一个拟报告的问题,均已完整执行 review-verification-protocol。 |
请按如下格式报告问题发现:
[FILE:LINE] ISSUE_TITLE Severity: Critical | Major | Minor | Informational 问题描述及影响说明。
| 问题类型 | 参考文档 |
|---|---|
| 缺失错误检查、错误包装、未使用 errors.Join | references/error-handling.md |
| 竞态条件、通道误用、goroutine 生命周期管理 | references/concurrency.md |
| 接口污染、命名规范、泛型使用 | references/interfaces.md |
| 资源泄漏、defer 误用、slog、命名 | references/common-mistakes.md |
_ = err)fmt.Errorf("...: %w", err))errors.Is/errors.As 替代字符串匹配进行错误判断errors.Join(Go 1.20+)-er 命名惯例(如 Reader, Closer)any 而非 interface{}any 或代码生成defer 关闭deferinit() 函数,改用显式初始化逻辑user.UserService → 应为 user.Service)slog 而非 logreturn err)panicinterface{} 而非 any以下均为合法的 Go 模式,标记它们将浪费开发者时间:
_ = err 并附带说明性注释 — 明确忽略错误且提供合理解释any — 用于真正泛型场景或与无类型 API 交互//nolint 指令附带原因说明 — 有解释说明时视为合理type Option func(*T) 配合 With* 构造函数属于惯用法sync.Pool 用于热点路径 — 在性能关键代码中减少内存分配压力时可接受context.Background() 用于 main 函数或测试中 — 顶层调用的有效根 Contextselect 中含 default 分支 — 非阻塞通道操作,属有意为之的模式i、err、ctx、ok 等为 Go 惯用写法仅当满足下列特定条件时,方可标记对应问题:
| 问题 | 仅当满足以下条件时标记 |
|---|---|
| 缺失错误检查 | 该错误返回具备可操作性(可重试、可记录或可传播) |
| goroutine 泄漏 | 该 goroutine 缺乏 context 取消路径 |
| 缺失 defer | 资源在下次获取或函数返回前未被显式关闭 |
| 接口污染 | 该接口包含超过 1 个方法,且仅有唯一使用者 |
| 循环变量捕获 | go.mod 中声明的 Go 版本低于 1.22 |
| 缺失 slog | go.mod 中声明的 Go 版本 ≥ 1.21,且代码使用 log 包输出结构化日志 |
务必满足审查工作流中的第 4 步:加载 review-verification-protocol,并对每一项拟报告的问题,完整执行其“报告前验证检查清单”。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.6万人学习
共89课时 | 133.2万人学习
共49课时 | 82.1万人学习