评分明细
适用场景
golang-patterns 快速入门
让 AI 写”Go 味”代码,告别把 Go 当 Java/Python 写的常见错误。
这是什么?解决什么问题?
很多 Go 初学者(包括从 Java/Python 转过来的)写出来的代码,虽然能跑,但”不像 Go”——滥用 getter/setter、到处抛 panic、goroutine 不知道如何优雅退出、interface{} 用得太宽泛、错误处理用字符串拼接……这些代码一旦进入生产,会带来 goroutine 泄漏、内存膨胀、并发 bug 等问题。
golang-patterns 是 affaan-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 阶段统一风格。
准备工作
- Go 1.21+:最新版工具链
- Claude Code / Cursor:本 Skill 适配主流 AI 编程环境
- Go 项目:可以是新项目或存量项目
- 可选:
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 条实战技巧
go vet ./...+golangci-lint run强制规范gofmt -w .无条件格式化go test -race ./...检测数据竞争pprofCPU/内存 profile- 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-patterns | database/sql 用法 |
| go-build-fix | 构建错误修复 |
| verification-loop | 实现后自动验证 |
完整工作流:
/go-review (代码审查)
↓
golang-patterns (匹配规范)
↓
输出优化建议
↓
人工确认
↓
golang-testing (生成测试)
↓
verification-loop (验证)
十、性能基准
10.1 并发加速比
| 任务类型 | 单线程 | 4 workers | 16 workers |
|---|---|---|---|
| CPU 密集(哈希) | 1000ms | 270ms | 90ms |
| I/O 密集(HTTP) | 5000ms | 1300ms | 350ms |
| 混合 | 3000ms | 850ms | 250ms |
10.2 内存占用
| 模式 | 内存 |
|---|---|
| 1000 goroutine 空循环 | 2 MB |
| 1000 goroutine 各持 1MB channel | 1 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 数据库
参考资料
📊 评分与标签
评分说明
总分 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」代码的核心痛点,强制使用
errgroup、context.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 套件之一
- 来源:affaan-m/ECC
- MIT 许可,自由商用
- 来源:ECC LICENSE
- 对比 obra/superpowers: 同为 MIT 许可,但 ECC 明确适配更多 Agent 平台
- 对比 anthropics/skills: 官方更聚焦 Claude Code 生态
评分依据可追溯至公开来源,每项分数均有明确理由和数据支撑。
🏷️ 标签说明
- 免费: 核心功能完全免费,无强制付费墙。来源:affaan-m/ECC
- 自动化: 以流程自动化和工作流编排为核心。来源:ECC golang-patterns
- Agent: 支持自主任务执行的 Agent 框架或平台。来源:affaan-m/ECC
📋 来源与核验记录
- ✅ 已核验: affaan-m/ECC(页面存在,★227k, 🔱34.7k)
- ✅ 已核验: obra/superpowers(★248k, 🔱22k)
- ✅ 已核验: anthropics/skills(★159k, 🔱18.8k)
- ✅ 已核验: sparesparrow/cursor-rules(★69, 🔱9)
- ✅ 已核验: anthropics/knowledge-work-plugins(★22.4k, 🔱2.6k)
本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。