Go Code Review

Polar Sponsor
爱发电 赞助
.NET 9.0

检查 Go 代码的惯用模式、错误处理、并发安全性和常见错误。用于审查 .go 文件、检查错误处理、goroutine 等。

Go Code Review : Review Workflow. 遵循此顺序, 顺序为.

功能概述

Go Code Review : Review Workflow. 遵循此顺序, 顺序为.是一项面向实际任务的技能,主要用于在下面的每个通道都满足之前不要发出结果;碱碱碱酸盐 mod – 打开 go.mod 并读取 go 指令;

核心要点

  • Pass : 您可以 sta。
  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。

使用与执行

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。

结果检查与注意事项

执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。

Go 代码审查

审查工作流

请严格按以下**顺序**执行。在满足下方所有 **“通过(Pass)”** 条件前,**不得输出任何问题发现(findings)**。

  1. 基线 go.mod — 打开 go.mod 文件,读取其中的 go 指令。
    通过条件:你能在审查前言或工作笔记中明确陈述该模块所声明的精确 go X.YY 版本号(例如 go 1.21)。仅当当前基线版本匹配时,才可应用对应版本限定的建议(如:Go < 1.22 时需注意循环变量捕获问题;Go 1.21+ 可用 slog/结构化日志;Go 1.20+ 可用 errors.Join)。

  2. 阅读上下文代码 — 对每个被修改的 .go 文件,须通读包含变更的完整函数或逻辑单元,而不仅限于 diff 片段。
    通过条件:对每个被修改的文件,至少通读一个完整封闭的函数(或包级 init 函数 / 变量块),且该函数/块必须包含本次变更。

  3. 划定检查清单范围 — 判断哪些《审查检查清单》模块适用于本次 diff(如:错误处理、并发、接口/类型、资源、命名)。为适用模块加载对应参考文档;跳过与 diff 完全无关的模块。
    通过条件:审查报告或工作笔记中须列出已应用的检查清单模块;对不适用模块,须标注 “N/A” 并附上一句紧扣 diff 的简要理由(例如:“变更中无任何并发逻辑”)。

  4. 报告前验证 — 加载并严格执行 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+)
  • 错误返回时同步返回零值

并发

  • 无 goroutine 泄漏(存在 context 取消机制或明确的关闭信号)
  • 通道仅由发送方关闭,且仅关闭一次
  • 共享状态受互斥锁(mutex)或 sync 类型保护
  • 使用 WaitGroup 等待 goroutine 完成
  • Context 在调用链中正确传递
  • 循环变量捕获问题已妥善处理(仅适用于 Go < 1.22 的代码库)

接口与类型

  • 接口由消费者定义,而非生产者定义
  • 接口名称遵循 -er 命名惯例(如 Reader, Closer)
  • 接口定义保持最小化(1–3 个方法)
  • 构造函数返回具体类型(而非接口)
  • Go 1.18+ 代码库中优先使用 any 而非 interface{}
  • 在合适场景下使用泛型,替代 any 或代码生成

资源与生命周期

  • 资源创建后立即用 defer 关闭
  • HTTP 响应体始终被关闭
  • 循环内不使用未包裹闭包的 defer
  • 避免使用 init() 函数,改用显式初始化逻辑

命名与风格

  • 导出标识符均有文档注释
  • 无冗余命名(如 user.UserService → 应为 user.Service)
  • 函数长度超过 5 行时禁用裸返回(naked return)
  • Context 作为第一个参数传入
  • Go 1.21+ 代码库中,结构化日志应使用 slog 而非 log

严重程度校准

Critical(阻断合并)

  • I/O、网络或数据库操作中未检查错误
  • goroutine 泄漏(无关闭路径)
  • 共享状态存在竞态条件(如未加同步的并发 map 访问)
  • 资源无限累积(如循环内 defer、连接未关闭)

Major(建议修复)

  • 错误返回缺少上下文(如直接 return err)
  • 启动 goroutine 后未使用 WaitGroup 等机制等待完成
  • 对可恢复错误使用 panic
  • Context 未向下游调用传递

Minor(酌情修复)

  • Go 1.18+ 代码库中仍使用 interface{} 而非 any
  • 导出标识符缺失文档注释
  • 存在冗余命名
  • 已知切片大小却未预分配容量

Informational(仅作提示)

  • 建议在存在代码生成的位置引入泛型
  • 关于接口设计的重构思路
  • 未经实测验证的性能优化建议

何时加载参考文档

  • 审查错误返回模式 → error-handling.md
  • 审查 goroutine、通道或 sync 类型 → concurrency.md
  • 审查类型定义、接口或泛型 → interfaces.md
  • 常规审查(资源、命名、init、性能等) → common-mistakes.md

有效模式(请勿标记)

以下均为合法的 Go 模式,标记它们将浪费开发者时间:

  • _ = err 并附带说明性注释 — 明确忽略错误且提供合理解释
  • 空接口 / any — 用于真正泛型场景或与无类型 API 交互
  • 短函数中的裸返回 — 函数长度 < 5 行且具有命名返回值时可接受
  • 未关闭的通道 — 当消费者通过 context 取消而非通道关闭来终止时
  • 互斥锁保护结构体字段 — 即使字段仅通过方法访问,此封装方式亦属正确
  • //nolint 指令附带原因说明 — 有解释说明时视为合理
  • 循环内使用 defer — 当意图是清理函数作用域资源时(如分批处理文件)
  • 函数式选项模式(Functional Options Pattern) — type Option func(*T) 配合 With* 构造函数属于惯用法
  • sync.Pool 用于热点路径 — 在性能关键代码中减少内存分配压力时可接受
  • context.Background() 用于 main 函数或测试中 — 顶层调用的有效根 Context
  • select 中含 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,并对每一项拟报告的问题,完整执行其“报告前验证检查清单”。

相关专题

更多
Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

0

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

0

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

0

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

0

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

0

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

0

19

loomy官网入口地址合集
loomy官网入口地址合集

本专题汇总了 Loomy 桌面 AI 助理的官方入口地址合集及使用指南。提供 macOS 与 Windows 客户端下载 。Loomy 是讯飞推出的桌面级 AI 工作搭子,支持文件整理、数据分析、网页操作及通过飞书/钉钉远程操控电脑,助你高效完成本地办公任务 。

2026.09.22

0

19

NumPy常见函数使用方法
NumPy常见函数使用方法

本专题整理 NumPy 常见函数使用方法相关教程,覆盖函数大全、参数用法、数组运算、统计聚合、排序处理、where 条件筛选、linspace 创建数列等常用场景,帮助读者快速掌握 NumPy 函数调用思路和实际数据处理技巧。

2026.09.22

0

21

NumPy性能优化版本更新与常见报错排查
NumPy性能优化版本更新与常见报错排查

本专题整理 NumPy 性能优化、版本更新与常见报错排查相关教程,覆盖向量化计算、广播性能、内存布局、NumPy 2.0 升级、版本兼容冲突、安装导入报错、dtype 溢出、矩阵运算异常和 broadcasting 报错修复,帮助读者系统掌握 NumPy 性能调优与问题定位方法。

2026.09.22

0

25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习