🤖 Agentic 全难度 📦 community

golang-patterns

golang-patterns Skill 深度评测:惯用 Go、并发、接口与错误处理

8.4 /10 ★★★★☆
📅 2026-06-15 · 🕒 5 分钟阅读 · 最后更新 2026-06-15 · 来源: community · 分析测评
#golang#go#concurrency#error-handling#ecc#everything-claude-code
📄 相关文章

📊 评分明细

功能完备度
8.4 核心功能齐全
🎯 易用性
8.1 安装即用
🔧 可扩展性
8.7 支持定制和 fork
🔗 生态协同
8.8 可链式调用
🛡️ 稳定性
8.7 内置验证流程

🎯 适用场景

golanggoconcurrencyerror-handlingecceverything-claude-code

golang-patterns 快速入门

让 AI 写”Go 味”代码,告别把 Go 当 Java/Python 写的常见错误。

这是什么?解决什么问题?

很多 Go 初学者(包括从 Java/Python 转过来的)写出来的代码,虽然能跑,但”不像 Go”——滥用 getter/setter、到处抛 panic、goroutine 不知道如何优雅退出、interface{} 用得太宽泛、错误处理用字符串拼接……这些代码一旦进入生产,会带来 goroutine 泄漏、内存膨胀、并发 bug 等问题。

golang-patternsaffaan-m/everything-claude-code 仓库里的 Go 专项 Skill,核心是把”惯用 Go(idiomatic Go)“的最佳实践封装成 AI 可调用的规则集。Skill 内部包含:命名约定(简短、混合大小写、不取 getXxx)、并发模式(goroutine + channel、context.Context 取消传播、errgroup 协同)、接口设计(小接口、接口接受、返回值具体类型)、错误处理(error 是值、wrap with %w、错误哨兵 errors.Is/errors.As)、包设计(扁平、不过度抽象)、性能(sync.Pool、避免 defer 在热路径)。

加载 Skill 后,AI 在帮你写 Go 代码时会主动避免反模式,生成符合 Go 社区审美的实现。Skill 特别适合在 Code Review 时给”看起来能跑但风格不对”的代码提改进建议。

适合:Go 初学者转 Go 老手、企业 Go 团队建立规范、Code Review 阶段统一风格。

准备工作

  1. Go 1.21+:最新版工具链
  2. Claude Code / Cursor:本 Skill 适配主流 AI 编程环境
  3. Go 项目:可以是新项目或存量项目
  4. 可选:golangci-lint 静态检查,验证 Skill 建议是否符合规范

3 步快速上手

第 1 步:安装 Skill

npx skills add affaan-m/everything-claude-code --skill golang-patterns

仓库:https://github.com/affaan-m/everything-claude-code

第 2 步:验证 Skill

向 AI 询问:

用 golang-patterns Skill,写一个并发下载 3 个 URL 的程序

如果 AI 用了 errgroupcontext.WithCancel、明确的 channel 关闭逻辑,说明 Skill 加载成功。

第 3 步:用 Skill 重构老代码

请用 golang-patterns Skill 重构 internal/service/user.go,
重点检查错误处理、并发安全、接口设计是否符合 Go 惯用法

AI 会输出 diff 形式的改进建议,逐条 review 后应用。

常见踩坑

  1. goroutine 泄漏:用 go func() { ... }() 启动后没控制生命周期,父函数 return 时 goroutine 还在跑。Skill 强制要求 ctx.Done() 监听。
  2. 错误处理字符串化:return errors.New("something wrong: " + err.Error()) 丢掉了原始错误链。Skill 要求用 fmt.Errorf("...: %w", err) 包装。
  3. interface{} 滥用:interface{} 相当于 Java 的 Object,用多了就失去类型安全。Skill 推荐用泛型(Go 1.18+)或具体类型。
  4. defer 在热路径的代价:defer 有约 50ns 开销,在 100 万次循环里会显著拖慢。热路径里 Skill 会建议改用手动释放。
  5. channel 方向不明确:chan T 是双向,chan<- T 是只发,<-chan T 是只收。Skill 强制函数签名用方向约束,降低误用。
  6. 包循环引用:package a import package b,package b 又 import package a,Go 编译失败。Skill 会主动识别并建议拆包。

初级用法

  1. HTTP handler:func(w http.ResponseWriter, r *http.Request),用 r.Context() 拿取消信号,handler 内不存全局状态。
  2. 错误处理:if err != nil { return fmt.Errorf("read config: %w", err) },层层 wrap,顶层用 errors.Is(err, os.ErrNotExist) 判断。
  3. 接口接受、返回具体类型:func NewUserService(db *sql.DB) *UserService,返回 *UserService 而非 UserServiceInterface

高级玩法

  1. Worker Pool:jobs chan Job; results chan Result,N 个 worker goroutine 消费 jobs,主 goroutine 收集 results,适合限流场景。
  2. Context 传播链:request → middleware → service → repo,每层都接受 ctx 并向下传,用户取消请求时整条链路优雅退出。
  3. 泛型数据结构(Go 1.18+):type Set[T comparable] map[T]struct{},用泛型实现类型安全的 Set,而不是 map[string]bool

小技巧

  • go vetstaticcheck 跑静态检查,很多 Skill 提到的反模式工具会主动报警。
  • 写并发代码前先用 go test -race 跑一遍,Data Race 比人眼 review 准得多。
  • 包名用单数(user 而不是 users),Go 社区惯例,IDE 自动补全更友好。
  • 函数返回 error 是最后一个返回值,这是 Go 社区的强约定,违反会显得”不 Go”。
  • 注释第一个单词是函数名(如 // ReadFile reads ...),go doc 生成的文档格式漂亮。
  • gofmt -s -w . 自动简化代码(如合并重复的 if-else),保持风格一致。
  • pprof 是性能剖析利器,在生产环境用 net/http/pprof 暴露端点,排查 CPU/内存问题。

常见问题 FAQ

Q1: 这个 Skill 跟 golang-patterns 有什么关系?必须装吗?

A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。

Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?

A: golang-patterns 来自 community,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。

Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?

A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。

Q4: 怎么验证 Skill 装对了?

A: 在 Agent 中输入”列出已加载的 Skill”或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。

Q5: 这个 Skill 有许可证吗?能商用吗?

A: 取决于 golang-patterns 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。

进阶学习建议

如果想进一步用好 golang-patterns,建议按以下路径学习:

第 1 周:熟练使用

  • 完成 3 步快速上手,跑通第一个任务
  • 试 2-3 个不同场景的真实任务
  • 记录”哪些 prompt 有效、哪些没用”——形成自己的 prompt 笔记

第 2 周:理解机制

  • 阅读 Skill 的官方文档(README、SKILL.md)
  • 了解 Skill 的”触发关键词”和”输出格式”
  • 学习”如何用更具体的描述触发 Skill”

第 3-4 周:组合使用

  • 跟其他 Skill 组合(比如代码审查 + 性能优化)
  • 跟其他 Agent 工具组合(Skill + MCP + 自定义脚本)
  • 沉淀团队/个人的 Skill 库

长期:贡献社区

  • 把自定义的 Skill 开源到 GitHub
  • 提 PR 改进现有 Skill
  • 写使用心得分享到 CSDN/掘金/知乎

推荐资源:

避免的坑:

  • 不要装太多 Skill(超过 10 个会拖慢 Agent)
  • 不要把 Skill 装在不兼容的 Agent 上
  • 不要直接复制 Skill 默认 prompt——要根据项目调整
  • 定期 review Skill 库的实用性,清理不用的

参考链接

实战经验:Go 微服务里的错误处理范式

下面演示一个 Go 后端服务里”错误处理全链路”的最佳实践,Skill 在每个环节都能给出建议。

步骤 1:自定义错误类型

type AppError struct {
    Code    string
    Message string
    Cause   error
}

func (e *AppError) Error() string {
    return fmt.Sprintf("[%s] %s: %v", e.Code, e.Message, e.Cause)
}

func (e *AppError) Unwrap() error {
    return e.Cause
}

Skill 会主动建议”实现 Unwrap 让 errors.Is / errors.As 能穿透”。

步骤 2:分层 wrap 错误

// repo 层
if err := db.QueryRow(...).Scan(&u); err != nil {
    return fmt.Errorf("query user by id=%d: %w", id, err)
}

// service 层
u, err := repo.GetUser(ctx, id)
if err != nil {
    return nil, fmt.Errorf("get user: %w", err)
}

// handler 层
u, err := svc.GetUser(ctx, id)
if err != nil {
    if errors.Is(err, sql.ErrNoRows) {
        return nil, &AppError{Code: "USER_NOT_FOUND", Cause: err}
    }
    return nil, fmt.Errorf("svc.GetUser: %w", err)
}

Skill 默认会强制”每层 wrap 一次”,保留完整错误链。

步骤 3:HTTP 错误响应

func writeError(w http.ResponseWriter, err error) {
    var appErr *AppError
    if errors.As(err, &appErr) {
        status := http.StatusInternalServerError
        switch appErr.Code {
        case "USER_NOT_FOUND":
            status = http.StatusNotFound
        case "INVALID_INPUT":
            status = http.StatusBadRequest
        }
        w.WriteHeader(status)
        json.NewEncoder(w).Encode(map[string]string{
            "code": appErr.Code,
            "message": appErr.Message,
        })
        return
    }
    w.WriteHeader(http.StatusInternalServerError)
    json.NewEncoder(w).Encode(map[string]string{"code": "INTERNAL"})
}

Skill 推荐统一错误出口,避免每处 handler 重复写。

步骤 4:用 errors.Is / errors.As 判断

if errors.Is(err, context.Canceled) {
    // 用户取消请求
}
if errors.As(err, &appErr) && appErr.Code == "USER_NOT_FOUND" {
    // 业务特定处理
}

配合使用的工具链

  • golangci-lint:静态检查,Skill 建议用 errorlint 规则检查 == 比较 error(应该用 errors.Is)。
  • errcheck:检查所有 error 返回值是否被处理,Skill 默认会主动提及。
  • pprof:CPU/内存 profiling,排查性能问题。
  • go vet:内置静态检查。
  • mockery:自动生成 interface mock,方便单测。
  • zap / zerolog:结构化日志,配合 errors.As 记录错误链。
  • slog(Go 1.21+):标准库结构化日志,新项目优先用。

进阶学习路径

  1. 基础阶段:Effective Go + Code Review Comments,建立基础规范。
  2. 中级阶段:读完 Rob Pike 的”Concurrency is not parallelism”演讲,理解 channel 哲学。
  3. 进阶阶段:读 Go 源码(net/http、sync、context),了解”标准库是怎么写的”。
  4. 高级阶段:研究 Go runtime 调度器、GC 调优、cgo 互操作,这是大厂 Go 工程师的分水岭。

本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。

golang-patterns Skill 多维度简评

类别:后端 / Go 惯用法 仓库:affaan-m/everything-claude-code 维护者:Affaan Mustafa / ECC 社区 理论基础:Effective Go + Google Go Style Guide


一、核心定位与价值

Go 是一门强调惯例的语言——同样一个功能,可以有 5 种写法,但只有 1-2 种是 idiomatic。golang-patterns Skill 强制让 AI 生成的 Go 代码遵守 Go 社区标准:

  • 简洁明了的函数实现,避免”聪明”但晦涩的写法
  • 类型设计零值可用(如 struct 字段默认值即为有效状态)
  • 函数参数优先接受接口,返回具体类型
  • 错误处理标准化(自动包裹上下文、定义哨兵错误)
  • 并发模式惯用(worker pool、errgroup、context 取消)
  • 接口设计(小而专注)
  • 标准项目结构(cmd/internal/pkg/api)

适用场景

  • 写新的 Go 函数、类型、包
  • 代码审查 / 重构(Go Reviewer Agent 配合)
  • 设计新包 / 模块
  • 团队协作统一 Go 代码规范

不适用场景

  • Go 之外的任何语言
  • 已经是非常 idiomatic 的资深 Gopher
  • 嵌入式 Go(TinyGo 限制)

二、核心模式库

2.1 函数实现模式

模式 1:简洁 + 错误包裹

// ❌ AI 写之前的"裸"返回
func GetUser(id string) (*User, error) {
    return db.FindUser(id)
}

// ✅ Skill 强制包裹
func GetUser(ctx context.Context, id string) (*User, error) {
    user, err := db.FindUser(ctx, id)
    if err != nil {
        return nil, fmt.Errorf("get user %s: %w", id, err)
    }
    return user, nil
}

Skill 强制

  • 函数第一参数是 context.Context(HTTP handler 除外)
  • 错误用 fmt.Errorf + %w 包裹
  • 错误信息含变量值

模式 2:可选参数(Functional Options)

// ❌ BAD: 长参数列表
func NewServer(host string, port int, timeout time.Duration, maxConns int, tlsCert string, tlsKey string) (*Server, error)

// ✅ GOOD: Functional Options
type Option func(*Server)

func WithHost(host string) Option { return func(s *Server) { s.host = host } }
func WithPort(port int) Option { return func(s *Server) { s.port = port } }
func WithTimeout(d time.Duration) Option { return func(s *Server) { s.timeout = d } }

func NewServer(opts ...Option) (*Server, error) {
    s := &Server{
        host:    "localhost",
        port:    8080,
        timeout: 30 * time.Second,
    }
    for _, opt := range opts {
        opt(s)
    }
    return s, nil
}

// Usage
server, _ := NewServer(
    WithHost("0.0.0.0"),
    WithPort(9090),
    WithTimeout(60*time.Second),
)

2.2 类型设计

模式 3:零值可用

// ❌ BAD: 必须先初始化
type BadCounter struct {
    counts map[string]int
}

c := &BadCounter{}
c.counts = make(map[string]int)

// ✅ GOOD: 零值即可用
type Counter struct {
    mu     sync.Mutex
    counts map[string]int
}

func NewCounter() *Counter {
    return &Counter{counts: make(map[string]int)}
}

// 或用 sync.Map
type SafeCounter struct {
    counts sync.Map
}

模式 4:参数接接口,返回具体类型

// ✅ GOOD: 输入接口,输出具体
func ProcessData(r io.Reader) (*Result, error) {
    // 接受任何 io.Reader(灵活)
    // 返回具体类型 *Result(调用方知道字段)
    data, err := io.ReadAll(r)
    if err != nil {
        return nil, err
    }
    return &Result{Data: data}, nil
}

原则

  • “Be conservative in what you do, be liberal in what you accept”(Postel 法则)
  • 接口接受 → 调用方灵活
  • 返回具体 → 不强迫调用方做 type assertion

2.3 错误处理

模式 5:哨兵错误(Sentinel Errors)

// 定义
var (
    ErrNotFound      = errors.New("resource not found")
    ErrAlreadyExists = errors.New("resource already exists")
    ErrUnauthorized  = errors.New("unauthorized")
)

// 返回
func FindUser(id string) (*User, error) {
    if id == "" {
        return nil, ErrNotFound
    }
    // ...
}

// 调用方检查
if errors.Is(err, ErrNotFound) {
    return c.JSON(404, ...)
}

模式 6:自定义错误类型(带上下文)

type ValidationError struct {
    Field   string
    Message string
}

func (e *ValidationError) Error() string {
    return fmt.Sprintf("validation failed on %s: %s", e.Field, e.Message)
}

// 返回
if name == "" {
    return nil, &ValidationError{Field: "name", Message: "cannot be empty"}
}

// 调用方断言
var verr *ValidationError
if errors.As(err, &verr) {
    log.Printf("validation error on field %s", verr.Field)
}

模式 7:错误链(%w

func LoadConfig(path string) (*Config, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return nil, fmt.Errorf("read config: %w", err)  // %w 保留原错误
    }
    // ...
}

// 客户端可以解开链
if errors.Is(err, os.ErrNotExist) {
    return defaultConfig
}

2.4 并发模式

模式 8:errgroup

import "golang.org/x/sync/errgroup"

func ProcessBatch(ctx context.Context, items []Item) error {
    g, ctx := errgroup.WithContext(ctx)

    for _, item := range items {
        item := item
        g.Go(func() error {
            return processItem(ctx, item)
        })
    }

    return g.Wait()  // 返回第一个错误
}

模式 9:Worker Pool

func WorkerPool(jobs <-chan Job, results chan<- Result, numWorkers int) {
    var wg sync.WaitGroup
    for i := 0; i < numWorkers; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for job := range jobs {
                results <- process(job)
            }
        }()
    }
    wg.Wait()
    close(results)
}

模式 10:Context 取消

func LongRunningTask(ctx context.Context) error {
    for {
        select {
        case <-ctx.Done():
            return ctx.Err()  // 客户端断开,立即返回
        default:
            // 干活
            if err := doWork(ctx); err != nil {
                return err
            }
        }
    }
}

模式 11:避免 Goroutine 泄漏

// ❌ BAD: goroutine 可能永远不退出
go func() {
    for {
        ch <- work()  // 没人接收就死锁
    }
}()

// ✅ GOOD: 用 buffered channel + 监听 ctx
go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            return
        case ch <- work():
        }
    }
}(ctx)

2.5 接口设计

模式 12:小而专注

// ❌ BAD: 胖接口
type UserRepository interface {
    Create(...)
    Update(...)
    Delete(...)
    Find(...)
    List(...)
    Count(...)
    // ... 20 个方法
}

// ✅ GOOD: 多个小接口
type UserCreator interface {
    Create(ctx context.Context, u *User) error
}
type UserFinder interface {
    Find(ctx context.Context, id string) (*User, error)
}
type UserLister interface {
    List(ctx context.Context, filter Filter) ([]*User, error)
}

模式 13:接口定义在使用方

// 在使用方定义接口(不要在实现方)
package http

type UserStore interface {  // 在 http 包定义
    Find(ctx context.Context, id string) (*User, error)
}

type UserHandler struct {
    store UserStore
}

// userRepo (在 db 包实现) 自动满足

好处:避免”包循环依赖”,接口自然只暴露需要的方法。

2.6 标准项目结构

myproject/
├── cmd/                    # 主程序入口
│   └── server/
│       └── main.go
├── internal/              # 私有代码(不可被外部 import)
│   ├── auth/
│   ├── user/
│   └── ...
├── pkg/                   # 公共库(可被外部 import)
│   └── utils/
├── api/                   # API 协议定义
│   ├── proto/
│   └── openapi.yaml
├── testdata/              # 测试数据
├── configs/               # 配置文件
├── deployments/           # K8s / Docker Compose
├── docs/                  # 文档
├── go.mod
├── go.sum
├── Makefile
└── README.md

三、完整工作流

3.1 触发词(自动应用)

  • “Go function” / “Go 函数”
  • “Go goroutine” / “协程”
  • “Go interface” / “接口”
  • “Go struct” / “结构体”
  • “Go error handling”
  • “Go project structure”

3.2 Skill 引导 Claude 输出

[用户] 写一个 HTTP handler 获取用户信息

[Skill 引导 Claude 输出]
1. 函数第一参数 ctx
2. 错误包裹用 %w
3. 接口定义在使用方
4. 用 sentry 或 zap 记录错误
5. JSON 序列化用 struct tag
6. HTTP 状态码语义化
7. 写表驱动测试
func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    id := chi.URLParam(r, "id")

    user, err := h.svc.FindUser(ctx, id)
    if err != nil {
        if errors.Is(err, service.ErrNotFound) {
            http.Error(w, "user not found", http.StatusNotFound)
            return
        }
        h.logger.Error("find user failed", "error", err, "id", id)
        http.Error(w, "internal error", http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}

四、实战场景

场景 1:代码审查

需求:用 /go-review 命令审查 PR。 Skill 输出

  • 函数第一参数是 context.Context
  • 错误用 %w 包裹?
  • 接口小而专注?
  • 零值可用?
  • 避免包级可变全局?
  • goroutine 监听 ctx 取消?

场景 2:新包设计

需求:设计一个限流器包。 Skill 输出

  • 包名 ratelimit(小写、单词)
  • 公开 API:Limiter 接口 + NewTokenBucket / NewSlidingWindow
  • 内部实现隐藏
  • 表驱动测试覆盖

场景 3:性能优化

需求:1000 个任务并发跑,加速。 Skill 输出

  • errgroup + 限流(避免打爆下游)
  • context 取消机制
  • 错误聚合
  • graceful shutdown

五、5 条实战技巧

  1. go vet ./... + golangci-lint run 强制规范
  2. gofmt -w . 无条件格式化
  3. go test -race ./... 检测数据竞争
  4. pprof CPU/内存 profile
  5. CI 跑 go mod verify 验证依赖完整性

六、6 条反合理化

借口反驳
”我 Java 转 Go,知道怎么写”Go 惯例和 Java 完全不同
”用 panic 简单”panic 仅用于”绝不可能发生"
"全局变量方便”全局可变状态 = 并发 bug
”interface{} 灵活”Go 1.18+ 用 any + generics 更安全
”goroutine 随便开”泄漏会拖垮整个进程
”我的项目小,不需要标准结构”一旦增长,重构成本高

七、真实踩坑案例

案例 1:Goroutine 泄漏

现象:服务跑 1 天后内存爆。 根因:goroutine 内 for { ch <- work() } 没人接收,但 select 没监听 ctx。 解决:用 buffered channel + ctx 取消。

案例 2:interface{} 与 type assertion

现象v.(int) 频繁 panic。 根因:type assertion 失败会 panic。 解决:用 v, ok := i.(int) 双返回值。

案例 3:sync.Mutex 死锁

现象:服务 hang 死。 根因:A 锁等 B 锁,B 锁等 A 锁。 解决

  • 锁顺序一致
  • sync.Mutex 包装 RWMutex
  • -race 检测

案例 4:defer 在循环中

现象:1000 个文件描述符没释放。 根因for _, f := range files { f, _ := os.Open(...); defer f.Close() },defer 在函数退出时才执行。 解决:把循环体抽成函数,或手动 Close。

// ❌ BAD
func Process(files []string) error {
    for _, path := range files {
        f, _ := os.Open(path)
        defer f.Close()  // 函数退出时一起关闭
        process(f)
    }
    return nil
}

// ✅ GOOD
func Process(files []string) error {
    for _, path := range files {
        if err := processFile(path); err != nil {
            return err
        }
    }
    return nil
}

func processFile(path string) error {
    f, err := os.Open(path)
    if err != nil { return err }
    defer f.Close()
    return process(f)
}

案例 5:错误被吞掉

现象if err != nil { return nil } 直接吞错误。 根因:追求代码简洁。 解决:至少 log 一下 log.Printf("warning: %v", err)

案例 6:包级 map 并发写

现象:concurrent map writes panic。 根因:未保护的 map 多 goroutine 写。 解决:用 sync.Map 或加锁。

案例 7:channel close 多次

现象close(ch); close(ch) panic。 根因:关闭已关闭的 channel。 解决:用 sync.Once 保护 close。

案例 8:值接收者 vs 指针接收者混用

现象:某些方法修改字段不生效。 根因:方法有的是值接收者,有的是指针接收者。 解决:所有方法统一指针接收者(除非 type 是 map/chan/func 等)。

案例 9:context 放在 struct 里

现象:struct 持有 context。 根因:context 应该第一参数。 解决:struct 不持有 context,通过方法传入。

案例 10:裸返回(naked return)

现象func f() (result int, err error) { return } 难读。 根因:naked return 在长函数中容易混淆。 解决:显式 return result, err


八、Q&A

Q: 跟 golang-testing 区别? A: golang-patterns 关注代码惯用法;golang-testing 关注测试模式(表驱动、覆盖率、fuzzing)。

Q: 跟 go-reviewer Agent 关系? A: Skill 提供”应该怎么写”的知识;Agent 自动审查代码并给出建议。

Q: 必须装在 Go 项目? A: 是。Skill 只对 .go 文件触发。

Q: 触发后 Claude 立即改代码? A: 不会。Skill 先让 Claude”理解”该用什么模式,再生成代码。

Q: 自定义模式? A: 可在 .claude/rules/golang/ 中追加团队专属模式。

Q: 中文支持? A: 注释和变量名可中文,Skill 指令是英文。

Q: 老 Go 项目适用? A: 适合,配合 golang-testing 渐进式改造。


九、与其他 Skills 配合

Skill配合方式
golang-testing配套测试模式
backend-patterns通用后端模式
postgres-patternsdatabase/sql 用法
go-build-fix构建错误修复
verification-loop实现后自动验证

完整工作流:

/go-review (代码审查)
  ↓
golang-patterns (匹配规范)
  ↓
输出优化建议
  ↓
人工确认
  ↓
golang-testing (生成测试)
  ↓
verification-loop (验证)

十、性能基准

10.1 并发加速比

任务类型单线程4 workers16 workers
CPU 密集(哈希)1000ms270ms90ms
I/O 密集(HTTP)5000ms1300ms350ms
混合3000ms850ms250ms

10.2 内存占用

模式内存
1000 goroutine 空循环2 MB
1000 goroutine 各持 1MB channel1 GB
errgroup 处理 10000 任务50 MB

十一、安装

# Claude Code
/plugin marketplace add affaan-m/everything-claude-code
/plugin install everything-claude-code@everything-claude-code
cp -r everything-claude-code/rules/common ~/.claude/rules/
cp -r everything-claude-code/rules/golang ~/.claude/rules/

# 通用
npx skills add affaan-m/everything-claude-code --skill golang-patterns

十二、总结

核心价值

  • Go 社区惯用法强制应用
  • 避免 AI 生成”Java 风格”Go 代码
  • 与 ECC 整个生态集成
  • 提升团队代码一致性

适用人群

  • Go 后端开发者
  • 微服务架构师
  • 云原生项目
  • 用 AI 工具(Claude Code / Cursor)辅助开发

投入产出比:⭐⭐⭐⭐(4/5)—— Go 团队必装。

何时不要用

  • 没用 Go
  • 不写并发代码
  • 一次性脚本

配套文档:golang-testing 测试 | backend-patterns 后端 | postgres-patterns 数据库


参考资料

  1. affaan-m/everything-claude-code GitHub
  2. Effective Go
  3. Google Go Style Guide
  4. Go Concurrency Patterns - Go Blog
  5. golang.org/x/sync/errgroup

📦 快速安装

1 npx (推荐)
npx skills add affaan-m/everything-claude-code --skill golang-patterns