plugins/languages/golang/skills/concurrency/SKILL.md
Go 并发规范——go.uber.org/atomic 原子操作(非 sync/atomic)、errgroup 并发编排(SetLimit 限流)、context 超时取消传播、sync.Pool 对象复用、WaitGroup.Go(Go 1.25+)、Go 1.23 iter 迭代器、Green Tea GC(Go 1.26 默认)。写 goroutine、设计并发流程、调查竞态/泄漏、性能调优时触发。
npx skillsauth add lazygophers/ccplugin golang-concurrencyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
go.uber.org/atomic,禁直接 sync/atomic。go func()。errgroup,必须 SetLimit 限制并发。sync.Pool 复用。import "go.uber.org/atomic"
counter := atomic.NewInt64(0)
counter.Inc()
counter.Add(10)
val := counter.Load()
flag := atomic.NewBool(false)
flag.Toggle()
flag.Store(true)
name := atomic.NewString("")
name.Store("hello")
类型安全 + API 友好,比标准库 sync/atomic 少 50% 出错。
var bufferPool = sync.Pool{
New: func() any { return new(bytes.Buffer) },
}
func processData(data []byte) string {
buf := bufferPool.Get().(*bytes.Buffer)
defer bufferPool.Put(buf)
buf.Reset()
buf.Write(data)
return buf.String()
}
适用:每秒上千次创建-销毁的临时对象(buffer、struct)。低频对象不要 Pool,反而增加复杂度。
import "golang.org/x/sync/errgroup"
eg, ctx := errgroup.WithContext(ctx)
eg.SetLimit(10) // 必设并发上限
for _, item := range items {
eg.Go(func() error {
return process(ctx, item)
})
}
err = eg.Wait()
if err != nil {
log.Errorf("err:%v", err)
return err
}
注:Go 1.22+ 循环变量自动每轮新建,无需 item := item。
简单场景,不需要错误传播:
var wg sync.WaitGroup
for _, item := range items {
wg.Go(func() { // 自动 Add(1) + defer Done()
process(item)
})
}
wg.Wait()
需错误传播 → 用 errgroup。仅扇出无错误 → WaitGroup.Go。
// 超时
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
// 取消
ctx, cancel := context.WithCancel(ctx)
defer cancel()
// 传播 + 协作取消
func processItem(ctx context.Context, item *Item) error {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
// 长操作中循环检查
for chunk := range item.Chunks() {
select {
case <-ctx.Done():
return ctx.Err()
default:
handle(chunk)
}
}
return nil
}
每个 goroutine 入口函数第一个参数必须是 ctx context.Context,整链路传到底。
import (
"iter"
"maps"
"slices"
)
for k, v := range maps.All(m) { fmt.Println(k, v) }
for i, v := range slices.All(s) { fmt.Println(i, v) }
func FilterIter[T any](seq iter.Seq[T], fn func(T) bool) iter.Seq[T] {
return func(yield func(T) bool) {
for v := range seq {
if fn(v) && !yield(v) { return }
}
}
}
适合流式/惰性场景;急切批处理仍用 candy。
result := make([]string, 0, len(items))
for _, item := range items {
result = append(result, item.String())
}
import "github.com/lazygophers/log"
buf := log.GetBuffer()
defer log.PutBuffer(buf)
GOEXPERIMENT=nogreenteagc 编译。GOEXPERIMENT=goroutineleakprofile go build .
# 运行后访问 /debug/pprof/goroutineleak
零开销,1.27 拟默认开启。
golang-testing)testing/synctest(Go 1.25 GA)+ -race 是标配:
go test -race ./...
| AI 借口 | 实际应验证 | | --- | --- | | "sync/atomic 是标准库" | 用 go.uber.org/atomic? | | "mutex 更简单" | 简单计数用 atomic? | | "goroutine 很轻量" | 有 errgroup + context 控制? | | "context 到处传麻烦" | 入口函数都接 ctx? | | "不需要 SetLimit" | errgroup 设上限? | | "iter 太新" | 适用场景用了? |
go.uber.org/atomicsync.Poolerrgroup + SetLimit-racetesting/synctesttools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。