🤖 Agentic 全难度 📦 community

golang-patterns

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

📄 相关文章

📊 评分明细

📦 打包完整度
2.2 2.2 / 2.5
🎯 实用性
2.2 2.2 / 2.5
📖 文档清晰度
1.7 1.7 / 2
👥 社区影响力
1.3 1.3 / 1.5
🔗 集成度
1.3 1.3 / 1.5

🎯 适用场景

免费自动化Agent

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<br>
```<br>
仓库:https://github.com/affaan-m/everything-claude-code<br>
### 第 2 步:验证 Skill<br>
向 AI 询问:<br>
```<br>
用 golang-patterns Skill,写一个并发下载 3 个 URL 的程序<br>
```<br>
如果 AI 用了 `errgroup`、`context.WithCancel`、明确的 channel 关闭逻辑,说明 Skill 加载成功。<br>
### 第 3 步:用 Skill 重构老代码<br>
```<br>
请用 golang-patterns Skill 重构 internal/service/user.go,<br>
重点检查错误处理、并发安全、接口设计是否符合 Go 惯用法<br>
```<br>
AI 会输出 diff 形式的改进建议,逐条 review 后应用。<br>
## 常见踩坑<br>
1. **goroutine 泄漏**:用 `go func() { ... }()` 启动后没控制生命周期,父函数 return 时 goroutine 还在跑。Skill 强制要求 `ctx.Done()` 监听。<br>
2. **错误处理字符串化**:`return errors.New("something wrong: " + err.Error())` 丢掉了原始错误链。Skill 要求用 `fmt.Errorf("...: %w", err)` 包装。<br>
3. **`interface{}` 滥用**:`interface{}` 相当于 Java 的 `Object`,用多了就失去类型安全。Skill 推荐用泛型(Go 1.18+)或具体类型。<br>
4. **defer 在热路径的代价**:`defer` 有约 50ns 开销,在 100 万次循环里会显著拖慢。热路径里 Skill 会建议改用手动释放。<br>
5. **channel 方向不明确**:`chan T` 是双向,`chan<- T` 是只发,`<-chan T` 是只收。Skill 强制函数签名用方向约束,降低误用。<br>
6. **包循环引用**:`package a` import `package b`,`package b` 又 import `package a`,Go 编译失败。Skill 会主动识别并建议拆包。<br>
## 初级用法<br>
1. **HTTP handler**:`func(w http.ResponseWriter, r *http.Request)`,用 `r.Context()` 拿取消信号,handler 内不存全局状态。<br>
2. **错误处理**:`if err != nil { return fmt.Errorf("read config: %w", err) }`,层层 wrap,顶层用 `errors.Is(err, os.ErrNotExist)` 判断。<br>
3. **接口接受、返回具体类型**:`func NewUserService(db *sql.DB) *UserService`,返回 `*UserService` 而非 `UserServiceInterface`。<br>
## 高级玩法<br>
1. **Worker Pool**:`jobs chan Job; results chan Result`,N 个 worker goroutine 消费 jobs,主 goroutine 收集 results,适合限流场景。<br>
2. **Context 传播链**:`request → middleware → service → repo`,每层都接受 `ctx` 并向下传,用户取消请求时整条链路优雅退出。<br>
3. **泛型数据结构**(Go 1.18+):`type Set[T comparable] map[T]struct{}`,用泛型实现类型安全的 Set,而不是 `map[string]bool`。<br>
## 小技巧<br>
- 用 `go vet` 和 `staticcheck` 跑静态检查,很多 Skill 提到的反模式工具会主动报警。<br>
- 写并发代码前先用 `go test -race` 跑一遍,Data Race 比人眼 review 准得多。<br>
- 包名用单数(`user` 而不是 `users`),Go 社区惯例,IDE 自动补全更友好。<br>
- 函数返回 `error` 是最后一个返回值,这是 Go 社区的强约定,违反会显得"不 Go"。<br>
- 注释第一个单词是函数名(如 `// ReadFile reads ...`),`go doc` 生成的文档格式漂亮。<br>
- 用 `gofmt -s -w .` 自动简化代码(如合并重复的 `if-else`),保持风格一致。<br>
- `pprof` 是性能剖析利器,在生产环境用 `net/http/pprof` 暴露端点,排查 CPU/内存问题。<br>
## 常见问题 FAQ<br>
**Q1: 这个 Skill 跟 golang-patterns 有什么关系?必须装吗?**<br>
A: Skill 是给 AI Agent 用的"技能包",能告诉 Agent 怎么按特定规范工作。**不是必须装**——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。<br>

**Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?**<br>
A: golang-patterns 来自 community,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。<br>

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

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

**Q5: 这个 Skill 有许可证吗?能商用吗?**<br>
A: 取决于 golang-patterns 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。<br>
## 参考链接<br>
- [Skill 仓库](https://github.com/affaan-m/everything-claude-code)<br>
- [Effective Go 官方指南](https://go.dev/doc/effective_go)<br>
- [Go Code Review Comments(社区规范)](https://github.com/golang/go/wiki/CodeReviewComments)<br>
- [Go Concurrency Patterns](https://go.dev/blog/pipelines)<br>
- [golangci-lint 配置](https://golangci-lint.run/)<br>
## 实战经验:Go 微服务里的错误处理范式<br>
下面演示一个 Go 后端服务里"错误处理全链路"的最佳实践,Skill 在每个环节都能给出建议。<br>
### 步骤 1:自定义错误类型<br>
```go<br>
type AppError struct {<br>
Code    string<br>
Message string<br>
Cause   error<br>
}<br>
func (e *AppError) Error() string {<br>
return fmt.Sprintf("[%s] %s: %v", e.Code, e.Message, e.Cause)<br>
}<br>
func (e *AppError) Unwrap() error {<br>
return e.Cause<br>
}<br>
```<br>
Skill 会主动建议"实现 Unwrap 让 errors.Is / errors.As 能穿透"。<br>
### 步骤 2:分层 wrap 错误<br>
```go<br>
// repo 层<br>
if err := db.QueryRow(...).Scan(&u); err != nil {<br>
return fmt.Errorf("query user by id=%d: %w", id, err)<br>
}<br>
// service 层<br>
u, err := repo.GetUser(ctx, id)<br>
if err != nil {<br>
return nil, fmt.Errorf("get user: %w", err)<br>
}<br>
// handler 层<br>
u, err := svc.GetUser(ctx, id)<br>
if err != nil {<br>
if errors.Is(err, sql.ErrNoRows) {<br>
return nil, &AppError{Code: "USER_NOT_FOUND", Cause: err}<br>
}<br>
return nil, fmt.Errorf("svc.GetUser: %w", err)<br>
}<br>
```<br>
Skill 默认会强制"每层 wrap 一次",保留完整错误链。<br>
### 步骤 3:HTTP 错误响应<br>
```go<br>
func writeError(w http.ResponseWriter, err error) {<br>
var appErr *AppError<br>
if errors.As(err, &appErr) {<br>
status := http.StatusInternalServerError<br>
switch appErr.Code {<br>
case "USER_NOT_FOUND":<br>
status = http.StatusNotFound<br>
case "INVALID_INPUT":<br>
status = http.StatusBadRequest<br>
}<br>
w.WriteHeader(status)<br>
json.NewEncoder(w).Encode(map[string]string{<br>
"code": appErr.Code,<br>
"message": appErr.Message,<br>
})<br>
return<br>
}<br>
w.WriteHeader(http.StatusInternalServerError)<br>
json.NewEncoder(w).Encode(map[string]string{"code": "INTERNAL"})<br>
}<br>
```<br>
Skill 推荐统一错误出口,避免每处 handler 重复写。<br>
### 步骤 4:用 `errors.Is` / `errors.As` 判断<br>
```go<br>
if errors.Is(err, context.Canceled) {<br>
// 用户取消请求<br>
}<br>
if errors.As(err, &appErr) && appErr.Code == "USER_NOT_FOUND" {<br>
// 业务特定处理<br>
}<br>
```<br>
## 配合使用的工具链<br>
- **`golangci-lint`**:静态检查,Skill 建议用 `errorlint` 规则检查 `==` 比较 error(应该用 `errors.Is`)。<br>
- **`errcheck`**:检查所有 error 返回值是否被处理,Skill 默认会主动提及。<br>
- **`pprof`**:CPU/内存 profiling,排查性能问题。<br>
- **`go vet`**:内置静态检查。<br>
- **`mockery`**:自动生成 interface mock,方便单测。<br>
- **`zap` / `zerolog`**:结构化日志,配合 `errors.As` 记录错误链。<br>
- **`slog`**(Go 1.21+):标准库结构化日志,新项目优先用。<br>

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

📊 评分与标签

评分说明

总分 8.6/10 · P_优选

📊 可观测社区指标(数据核验日期:2026-07-07)

  • GitHub: affaan-m/ECC ★227k, 🔱34.7k(原名 everything-claude-code,已更名 ECC)
  • 最新发布: 3 天前,2,254 Commits,33 Branches,15 Tags
  • Issues/PRs: 20 Issues, 53 Pull Requests

📦 可安装性 2.2/2.5

  • 安装方式: 通过 npx skills add affaan-m/everything-claude-code --skill golang-patterns 安装,或克隆 ECC 仓库后复制 rules 目录到 ~/.claude/rules/
  • 依赖复杂度: 纯 Markdown 规则文件,零外部依赖,加载即生效。ECC 以其丰富的 Agent 兼容性著称,支持 Claude Code / Codex / Opencode / Cursor 等多种环境
    • 来源:同上
  • 对比 obra/superpowers: 同为大型 Agent Skills 套件,ECC 安装方式略有不同但同样简便
  • 对比 anthropics/skills: 官方安装方式更统一,但 ECC 覆盖的 Agent 类型更广

🎯 实用性 2.2/2.5

  • 核心功能覆盖: 涵盖 13 种 Go 惯用模式(函数实现、类型设计、错误处理链、并发模式、接口设计、项目结构等),覆盖从代码生成到 Code Review 的全链路
  • 解决实际问题的能力: 解决 Go 开发者(尤其从 Java/Python 转来的)编写「不 Go」代码的核心痛点,强制使用 errgroupcontext.Context 传播、哨兵错误、小接口等 Go 社区最佳实践。特别适合 Code Review 和团队规范建设
    • 来源:同上
  • 对比 golang-testing(ECC): 同为 ECC 套件,侧重测试模式(表驱动、fuzzing),两者配合使用覆盖 Go 开发全流程
  • 对比 backend-patterns(ECC): 通用后端模式,不限定语言

📖 文档质量 1.6/2.0

  • README 完整度: SKILL.md 完整定义了 13 种 Go 模式的触发词、代码示例和反模式对照。ECC 主仓库提供 2,254 次 Commits 的持续文档迭代
  • 示例代码: 每个模式附带「✅ GOOD / ❌ BAD」对照示例,清晰展示改进前后的差异。但缺少端到端的完整项目实战演示
    • 来源:同上
  • 对比 golang-testing(ECC): 示例更加针对测试场景,两者文档风格一致
  • 对比 obra/superpowers: 文档结构相似,但 Obra 更强调决策流程图

👥 社区活跃 1.4/1.5

  • ★227k, 🔱34.7k, 2,254 Commits,ECC 团队持续维护(3 天前更新),20 Issues, 53 PRs
  • ECC 是 GitHub 上最大的 Agent Skills 集合之一,社区参与度和贡献者活跃度极高
    • 来源:同上
  • 对比 obra/superpowers(★248k): 同为 Top 级 Agent Skills 生态,ECC 更偏企业级
  • 对比 anthropics/skills(★159k): Anthropic 官方社区规模略小但专注官方生态

🔗 兼容性 1.2/1.5

  • 兼容 Claude Code / Codex / Opencode / Cursor / Windsurf 等多种 AI 编程工具,是兼容性最广泛的 Agent Skills 套件之一
  • MIT 许可,自由商用
  • 对比 obra/superpowers: 同为 MIT 许可,但 ECC 明确适配更多 Agent 平台
  • 对比 anthropics/skills: 官方更聚焦 Claude Code 生态

评分依据可追溯至公开来源,每项分数均有明确理由和数据支撑。

🏷️ 标签说明

  • 免费: 核心功能完全免费,无强制付费墙。来源:affaan-m/ECC
  • 自动化: 以流程自动化和工作流编排为核心。来源:ECC golang-patterns
  • Agent: 支持自主任务执行的 Agent 框架或平台。来源:affaan-m/ECC

📋 来源与核验记录


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