其他
构建高并发 Go 微服务时:用…
在开发 Go 1.21+ 应用且需要并发编程、微服务架构、性能优化或 idiomatic Go 实现时,按流程设计接口、实现、lint、profile、测试。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 46/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 41/100 ×0.15
适用场景
构建高并发 Go 微服务时:用 goro通用
解决思路
- 分析架构:审查模块结构、接口和并发模式。
- 设计接口:创建小而专注的接口,并通过组合构建。
- 实现:编写符合 Go 惯例的代码,正确处理错误并传播 context;继续前运行 `go vet ./...`。
- Lint 与验证:运行 `golangci-lint run`,并在继续前修复所有报告的问题。
- 优化:使用 pprof 进行性能分析,编写基准测试,消除分配。
- 测试:编写带子测试的表驱动测试,使用 `-race` flag、模糊测试,覆盖率达到 80%+;提交前确认竞态检测器通过。
- 按上下文加载并发参考:处理 goroutines、channels、select、同步原语时加载 `references/concurrency.md`。
- 按上下文加载接口参考:设计接口、使用 io.Reader/Writer、组合时加载 `references/interfaces.md`。
- 按上下文加载泛型参考:使用类型参数、约束、泛型模式时加载 `references/generics.md`。
- 按上下文加载测试参考:编写表驱动测试、基准测试、模糊测试时加载 `references/testing.md`。
- 按上下文加载项目结构参考:规划模块布局、内部包、go.mod 时加载 `references/project-structure.md`。
- 实现 goroutine 时使用带 context 取消和错误传播的模式:worker 在 `ctx.Done()` 或被取消时通过 `errCh` 返回错误。
- 使用 `context.WithTimeout` 控制 pipeline 总耗时,并用 `defer cancel()` 释放资源。
- 使用带缓冲的 `jobCh` 和 `errCh`,发送完任务后 `close(jobCh)`,并在 `select` 中等待 `errCh` 或 `ctx.Done()`。
- 确保关键属性:通过 `ctx` 限制 goroutine 生命周期;使用 `%w` 传播错误;取消时避免 goroutine 泄漏。
- 必须做:对所有代码使用 gofmt 和 golangci-lint。
- 必须做:给所有阻塞操作添加 context.Context。
- 必须做:显式处理所有错误(不要裸返回)。
- 必须做:编写带子测试的表驱动测试。
- 必须做:为所有导出的函数、类型和包写文档。
- 必须做:对泛型使用 `X | Y` 联合约束(Go 1.18+)。
- 必须做:用 `fmt.Errorf` 配合 `%w` 传播错误。
- 必须做:在测试中运行竞态检测器(`-race` flag)。
- 禁止做:忽略错误(避免无理由使用 `_` 赋值)。
- 禁止做:用 panic 处理正常错误。
- 禁止做:创建没有清晰生命周期管理的 goroutine。
- 禁止做:跳过 context 取消处理。
- 禁止做:没有性能理由时使用反射。
- 禁止做:粗心混用同步和异步模式。
- 禁止做:硬编码配置(使用函数选项或环境变量)。
- 输出模板:实现 Go 功能时,先提供接口定义(契约优先)。
- 输出模板:提供具有正确包结构的实现文件。
- 输出模板:提供带表驱动测试的测试文件。
- 输出模板:简要解释所使用的并发模式。
- 构建微服务时,使用 gRPC 或 REST 设计并实现服务。
- 围绕以下知识范围实现:Go 1.21+、goroutines、channels、select、sync package、generics、类型参数、约束、io.Reader/Writer、gRPC、context、错误包装、pprof profiling、基准测试、表驱动测试、模糊测试、go.mod、内部包、函数选项。
适用边界 · 注意事项
- 不适用于非 Go 项目或不需要并发、微服务、性能优化的简单脚本。
- 如果不打算使用 golangci-lint、pprof、竞态检测器或无法使用 Go 1.21+,需要调整这些做法。
- 不适用于无法运行 Go 工具链和测试环境的情况。