go-review
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGo — Code Review
Go — 代码审查
Core Principles
核心原则
- Catch what the compiler can't. Focus on design decisions — error strategies, goroutine lifecycles, API evolution safety.
- Flag the irreversible. Exported APIs, interface contracts, and error types ship forever. These deserve the most scrutiny.
- Flag inconsistency. Style violations compound. One embedded mutex today becomes ten next quarter.
- 捕捉编译器无法检测的问题。聚焦于设计决策——错误处理策略、goroutine生命周期、API演进的安全性。
- 标记不可逆转的内容。导出的API、接口契约和错误类型一旦发布便会长期存在,这些内容需要最严格的审查。
- 标记不一致的问题。风格违规会不断累积。今天嵌入一个互斥锁,下个季度可能就会变成十个。
Reference Index
参考索引
| Reference | Topics |
|---|---|
| api-design | Export audit, signature evolution, parameter/result object usage |
| errors | Log-and-return, missing |
| interfaces | Compile-time checks, bloat detection, pointer-to-interface, driver pattern |
| concurrency | Embedded mutexes, goroutine leaks, WaitGroup races, unbounded spawning |
| safety | Bare type assertions, missing defer, panic in library, boundary copies |
| performance | |
| code-style | Naming, declarations, organization — combined style checks |
| testing | Table-driven tests, assert vs require, bloated tables, goleak |
| functional-options | Exposed options struct, missing defaults, missing WithX |
| logging | fmt.Sprintf in logs, wrong level, raw structs, global logger in library |
| deterministic-simulation-testing | Direct time/rand/os calls, non-deterministic maps, missing seed logging, over-abstracted DST |
| 参考链接 | 主题 |
|---|---|
| api-design | 导出审计、签名演进、参数/结果对象的使用 |
| errors | 日志并返回、缺失 |
| interfaces | 编译时检查、冗余检测、指针转接口、驱动模式 |
| concurrency | 嵌入互斥锁、goroutine泄漏、WaitGroup竞争、无限制生成goroutine |
| safety | 裸类型断言、缺失defer、库中触发panic、边界拷贝 |
| performance | 使用 |
| code-style | 命名、声明、组织——综合风格检查 |
| testing | 表驱动测试、assert与require的区别、冗余测试表、goleak工具 |
| functional-options | 暴露选项结构体、缺失默认值、缺少WithX方法 |
| logging | 日志中使用fmt.Sprintf、错误日志级别、原始结构体、库中使用全局日志器 |
| deterministic-simulation-testing | 直接调用time/rand/os、非确定性映射、缺失种子日志、过度抽象的确定性模拟测试 |
When to Apply
适用场景
Apply during:
- Code reviews of Go pull requests
- Auditing existing Go packages
- Pre-merge review of new public APIs
Do NOT apply to non-Go files.
适用于:
- Go拉取请求的代码审查
- 现有Go包的审计
- 新公共API合并前的审查
请勿应用于非Go文件。
Quick Reference
速查指南
Errors: Flag log-and-return. Flag missing . Flag capitalized messages. Flag where needed. Flag mixed strategies. Flag /type-assertion checks.
%w%s%q==Interfaces: Flag missing . Flag params. Flag >3 methods. Flag embedded interfaces. Flag missing driver pattern.
var _ I = (*T)(nil)*InterfaceConcurrency: Flag embedded mutexes. Flag channel size >1. Flag fire-and-forget goroutines. Flag missing . Flag inside goroutine.
ctx.Done()wg.AddSafety: Flag bare type assertions. Flag missing defer. Flag panic in library. Flag outside main. Flag uncopied boundaries.
os.ExitPerformance: Flag . Flag → in loops. Flag missing pre-allocation. Flag concatenation in loops.
fmt.Sprint[]bytestring+Style: Flag generic package names. Flag wrong import order. Flag deep nesting. Flag positional struct fields.
Testing: Flag non-table-driven tests. Flag for preconditions. Flag >10 case tables without split.
assertOptions: Flag exported options struct. Flag missing defaults. Flag mixed options + param objects.
Logging: Flag in log args. Flag as message. Flag wrong log level. Flag raw structs without . Flag global logger in library. Flag missing variant.
fmt.Sprintferr.Error()LogValuer*ContextDST: Flag direct . Flag global . Flag direct I/O. Flag non-deterministic map iteration. Flag missing seed logging. Flag over-abstracted Clock/FS interfaces where function types suffice.
time.Now()rand.*os.*错误处理:标记“日志并返回”的情况。标记缺失的情况。标记大写开头的错误消息。标记应使用却使用的情况。标记混合的错误处理策略。标记使用/类型断言检查错误的情况。
%w%q%s==接口:标记缺失的情况。标记类型的参数。标记包含超过3个方法的接口。标记嵌入的接口。标记未使用驱动模式的情况。
var _ I = (*T)(nil)*Interface并发:标记嵌入的互斥锁。标记通道大小大于1的情况。标记“一触发就不管”的goroutine。标记缺失的情况。标记在goroutine内部调用的情况。
ctx.Done()wg.Add安全性:标记裸类型断言。标记缺失defer的情况。标记库中触发panic的情况。标记在main函数外调用的情况。标记未拷贝边界的情况。
os.Exit性能:标记使用的情况。标记循环中进行→转换的情况。标记缺失预分配的情况。标记循环中使用进行字符串拼接的情况。
fmt.Sprint[]bytestring+风格:标记通用的包名。标记错误的导入顺序。标记深层嵌套的代码。标记使用位置参数的结构体字段。
测试:标记非表驱动的测试。标记对前置条件使用的情况。标记包含超过10个用例却未拆分的测试表。
assert函数选项:标记暴露的选项结构体。标记缺失默认值的情况。标记混合使用选项与参数对象的情况。
日志记录:标记日志参数中使用的情况。标记将作为日志消息的情况。标记错误的日志级别。标记未使用的原始结构体。标记库中使用全局日志器的情况。标记缺失变体的情况。
fmt.Sprintferr.Error()LogValuer*Context确定性模拟测试(DST):标记直接调用的情况。标记全局使用的情况。标记直接调用进行I/O的情况。标记非确定性的映射迭代。标记缺失种子日志的情况。标记在可用函数类型的场景下过度抽象Clock/FS接口的情况。
time.Now()rand.*os.*