Go concurrency
Skill fusengine/agents/plugins/go-expert/skills/go-concurrency
Use when writing or reviewing Go concurrency — goroutines, channels, errgroup, context cancellation, or goroutine leaks. Not for sequential idioms (go-core-idioms).From its SKILL.md
npx -y skills add fusengine/agents --skill go-concurrencyAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 22 stars22 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.9 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it
Go Concurrency
Goroutines, channels, context, and errgroup for Go 1.26 — plus the number-one
documented pitfall: leaking goroutines on an unbuffered channel + early return.
Agent Workflow (MANDATORY)
Before ANY implementation, use TeamCreate to spawn 3 agents:
- fuse-ai-pilot:explore-codebase - Map existing goroutine/channel/context usage
- fuse-ai-pilot:research-expert - Verify errgroup/context docs via Context7/Exa
- mcp__context7__query-docs - Confirm
golang.org/x/sync/errgroupsignatures
After implementation, run fuse-ai-pilot:sniper for validation, and run tests
with go test -race ./....
Overview
| Feature | Description |
|---|---|
| Goroutines & channels | Lightweight concurrency + typed communication |
| errgroup | Parallelism + error aggregation + context cancellation |
| context | First param, propagated strictly, carries cancellation/deadline |
| WaitGroup vs channels | Counting-only vs result/error passing |
| Race detector | -race in tests/CI to catch data races |
| Leak profile (1.26) | GOEXPERIMENT=goroutineleakprofile / /debug/pprof/goroutineleak |
Critical Rules
context.Contextis the first parameter - namedctx, never stored in a struct- Every started goroutine must be able to exit - or it leaks (see rule 4)
- Prefer
errgroupfor fan-out with errors - it handles wait + first error + cancel - Unbuffered channel + early return = leak - senders block forever; buffer or drain
- Test with
-race- a passing test without-raceproves nothing about races
Architecture
internal/
├── fetch/
│ ├── fetch.go # errgroup.WithContext fan-out, bounded by SetLimit
│ └── worker.go # worker pool: fixed goroutines drain a jobs channel
└── pipeline/
└── stage.go # ctx-cancellable stages, buffered hand-off channels
→ See errgroup-patterns.md for full example
Reference Guide
Concepts
| Topic | Reference | When to Consult |
|---|---|---|
| Goroutines & channels | goroutines-channels.md | Buffered vs not, select, WaitGroup vs channels |
| errgroup | errgroup.md | Fan-out, error aggregation, SetLimit, TryGo |
| context | context-propagation.md | Cancellation, deadlines, propagation rules |
| Goroutine leaks | goroutine-leaks.md | The #1 pitfall + the 1.26 leak profile |
Templates
| Template | When to Use |
|---|---|
| errgroup-patterns.md | Bounded parallel work with error handling |
| worker-pool.md | Fixed workers draining a job queue |
Quick Reference
Parallel work with errgroup
g, ctx := errgroup.WithContext(ctx)
g.SetLimit(8) // bound concurrency
for _, u := range urls {
g.Go(func() error { return fetch(ctx, u) })
}
if err := g.Wait(); err != nil { // first non-nil error; cancels ctx
return err
}
→ See errgroup.md
Avoid the leak (buffer so senders never block)
ch := make(chan result, len(items)) // buffered → early return can't strand senders
→ See goroutine-leaks.md
Best Practices
DO
- Pass
ctxfirst and thread it through every blocking call - Reach for
errgroupbefore hand-rollingWaitGroup+ error channels - Buffer result channels to the number of senders, or fully drain them
- Run
go test -race; tryGOEXPERIMENT=goroutineleakprofilein CI (1.26)
DON'T
- Return early from a fan-out while goroutines still block on an unbuffered channel
- Store a
context.Contextin a struct field - Use a bare
sync.WaitGroupwhen goroutines return errors (useerrgroup) - Assume tests are race-free without the
-raceflag
What ships with it: 7 files
16.1 KB alongside SKILL.md
references/
- context-propagation.md2.7 KB
- errgroup.md2.7 KB
- goroutine-leaks.md3.5 KB
- goroutines-channels.md3.0 KB
- templates/errgroup-patterns.md2.0 KB
- templates/worker-pool.md2.2 KB
- .gitkeep0 B