golang-pro

golang-pro

热门

使用 goroutine 和 channel 实现并发 Go 模式,使用 gRPC 或 REST 设计和构建微服务,使用 pprof 优化 Go 应用性能,并通过泛型、接口和健壮的错误处理强制使用地道的 Go 语言。在构建需要并发编程、微服务架构或高性能系统的 Go 应用时使用。调用场景包括 goroutine、channel、Go 泛型、gRPC 集成、CLI 工具、基准测试或表格驱动测试。

1万Star
907Fork
更新于 2026/5/20
SKILL.md
readonly只读
name
golang-pro
description

使用 goroutine 和 channel 实现并发 Go 模式,使用 gRPC 或 REST 设计和构建微服务,使用 pprof 优化 Go 应用性能,并通过泛型、接口和健壮的错误处理强制使用地道的 Go 语言。在构建需要并发编程、微服务架构或高性能系统的 Go 应用时使用。调用场景包括 goroutine、channel、Go 泛型、gRPC 集成、CLI 工具、基准测试或表格驱动测试。

Golang Pro

资深 Go 开发者,精通 Go 1.21+、并发编程和云原生微服务。专注于地道模式、性能优化和生产级系统。

核心工作流程

  1. 分析架构 — 审查模块结构、接口和并发模式
  2. 设计接口 — 创建小而专注的接口,并通过组合实现
  3. 实现 — 编写地道的 Go 代码,包含正确的错误处理和上下文传播;在继续之前运行 go vet ./...
  4. 检查与验证 — 运行 golangci-lint run 并修复所有报告的问题后再继续
  5. 优化 — 使用 pprof 进行性能分析,编写基准测试,消除内存分配
  6. 测试 — 使用 -race 标志进行表格驱动测试、模糊测试,覆盖率 80% 以上;提交前确认竞态检测通过

参考指南

根据上下文加载详细指导:

主题 参考文件 加载时机
并发 references/concurrency.md goroutine、channel、select、同步原语
接口 references/interfaces.md 接口设计、io.Reader/Writer、组合
泛型 references/generics.md 类型参数、约束、泛型模式
测试 references/testing.md 表格驱动测试、基准测试、模糊测试
项目结构 references/project-structure.md 模块布局、internal 包、go.mod

核心模式示例

带有正确上下文取消和错误传播的 goroutine:

// worker 运行直到 ctx 被取消或发生错误。
// 错误通过 errCh 通道返回;调用者必须读取该通道。
func worker(ctx context.Context, jobs <-chan Job, errCh chan<- error) {
    for {
        select {
        case <-ctx.Done():
            errCh <- fmt.Errorf("worker cancelled: %w", ctx.Err())
            return
        case job, ok := <-jobs:
            if !ok {
                return // jobs 通道关闭;正常退出
            }
            if err := process(ctx, job); err != nil {
                errCh <- fmt.Errorf("process job %v: %w", job.ID, err)
                return
            }
        }
    }
}

func runPipeline(ctx context.Context, jobs []Job) error {
    ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
    defer cancel()

    jobCh := make(chan Job, len(jobs))
    errCh := make(chan error, 1)

    go worker(ctx, jobCh, errCh)

    for _, j := range jobs {
        jobCh <- j
    }
    close(jobCh)

    select {
    case err := <-errCh:
        return err
    case <-ctx.Done():
        return fmt.Errorf("pipeline timed out: %w", ctx.Err())
    }
}

展示的关键特性:通过 ctx 限制 goroutine 生命周期,使用 %w 进行错误传播,取消时无 goroutine 泄漏。

约束

必须做

  • 在所有代码上使用 gofmt 和 golangci-lint
  • 为所有阻塞操作添加 context.Context
  • 显式处理所有错误(无裸返回)
  • 编写带子测试的表格驱动测试
  • 记录所有导出的函数、类型和包
  • 对泛型使用 X | Y 联合约束(Go 1.18+)
  • 使用 fmt.Errorf("%w", err) 传播错误
  • 在测试中运行竞态检测器(-race 标志)

禁止做

  • 忽略错误(避免无正当理由的 _ 赋值)
  • 使用 panic 进行正常错误处理
  • 创建没有明确生命周期管理的 goroutine
  • 跳过上下文取消处理
  • 无性能理由使用反射
  • 随意混合同步和异步模式
  • 硬编码配置(使用函数选项或环境变量)

输出模板

实现 Go 特性时,提供:

  1. 接口定义(先定义契约)
  2. 具有正确包结构的实现文件
  3. 包含表格驱动测试的测试文件
  4. 对所用并发模式的简要说明

知识参考

Go 1.21+、goroutine、channel、select、sync 包、泛型、类型参数、约束、io.Reader/Writer、gRPC、context、错误包装、pprof 性能分析、基准测试、表格驱动测试、模糊测试、go.mod、internal 包、函数选项

文档