golang-patterns
golang-patterns Skill 深度评测:惯用 Go、并发、接口与错误处理
评分明细
适用场景
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
仓库:https://github.com/affaan-m/everything-claude-code
第 2 步:验证 Skill
向 AI 询问:
用 golang-patterns Skill,写一个并发下载 3 个 URL 的程序
如果 AI 用了 errgroup、context.WithCancel、明确的 channel 关闭逻辑,说明 Skill 加载成功。
第 3 步:用 Skill 重构老代码
请用 golang-patterns Skill 重构 internal/service/user.go,
重点检查错误处理、并发安全、接口设计是否符合 Go 惯用法
AI 会输出 diff 形式的改进建议,逐条 review 后应用。
常见踩坑
- goroutine 泄漏:用
go func() { ... }()启动后没控制生命周期,父函数 return 时 goroutine 还在跑。Skill 强制要求ctx.Done()监听。 - 错误处理字符串化:
return errors.New("something wrong: " + err.Error())丢掉了原始错误链。Skill 要求用fmt.Errorf("...: %w", err)包装。 interface{}滥用:interface{}相当于 Java 的Object,用多了就失去类型安全。Skill 推荐用泛型(Go 1.18+)或具体类型。- defer 在热路径的代价:
defer有约 50ns 开销,在 100 万次循环里会显著拖慢。热路径里 Skill 会建议改用手动释放。 - channel 方向不明确:
chan T是双向,chan<- T是只发,<-chan T是只收。Skill 强制函数签名用方向约束,降低误用。 - 包循环引用:
package aimportpackage b,package b又 importpackage a,Go 编译失败。Skill 会主动识别并建议拆包。
初级用法
- HTTP handler:
func(w http.ResponseWriter, r *http.Request),用r.Context()拿取消信号,handler 内不存全局状态。 - 错误处理:
if err != nil { return fmt.Errorf("read config: %w", err) },层层 wrap,顶层用errors.Is(err, os.ErrNotExist)判断。 - 接口接受、返回具体类型:
func NewUserService(db *sql.DB) *UserService,返回*UserService而非UserServiceInterface。
高级玩法
- Worker Pool:
jobs chan Job; results chan Result,N 个 worker goroutine 消费 jobs,主 goroutine 收集 results,适合限流场景。 - Context 传播链:
request → middleware → service → repo,每层都接受ctx并向下传,用户取消请求时整条链路优雅退出。 - 泛型数据结构(Go 1.18+):
type Set[T comparable] map[T]struct{},用泛型实现类型安全的 Set,而不是map[string]bool。
小技巧
- 用
go vet和staticcheck跑静态检查,很多 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/掘金/知乎
推荐资源:
- 官方文档:https://github.com/affaan-m/everything-claude-code
- 官方仓库 README 里的 Examples
- 社区最佳实践:Anthropic 官方博客 https://www.anthropic.com/blog
- 国内社区:CSDN AI 板块、掘金 AI 板块
避免的坑:
- 不要装太多 Skill(超过 10 个会拖慢 Agent)
- 不要把 Skill 装在不兼容的 Agent 上
- 不要直接复制 Skill 默认 prompt——要根据项目调整
- 定期 review Skill 库的实用性,清理不用的
参考链接
- Skill 仓库:https://github.com/affaan-m/everything-claude-code
- Effective Go 官方指南:https://go.dev/doc/effective_go
- Go Code Review Comments(社区规范):https://github.com/golang/go/wiki/CodeReviewComments
- Go Concurrency Patterns:https://go.dev/blog/pipelines
- golangci-lint 配置:https://golangci-lint.run/
实战经验: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+):标准库结构化日志,新项目优先用。
进阶学习路径
- 基础阶段:
Effective Go+Code Review Comments,建立基础规范。 - 中级阶段:读完 Rob Pike 的”Concurrency is not parallelism”演讲,理解 channel 哲学。
- 进阶阶段:读 Go 源码(net/http、sync、context),了解”标准库是怎么写的”。
- 高级阶段:研究 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 条实战技巧
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 数据库
参考资料
快速安装
npx skills add affaan-m/everything-claude-code --skill golang-patterns