SkillAgentSearch skills...

golang-concurrency

Golang concurrency design — goroutine lifecycle and leak prevention, channels and `select`, channel ownership and direction, `sync.Mutex`/`RWMutex`/`sync.Map`/`sync.Once`/atomics, `errgroup`, `singleflight`, worker pools, and fan-out/fan-in pipelines

Install / Use

npx skills add samber/cc-skills-golang --skill golang-concurrency

Installs into whichever agent you are using.

About this skill
📄

SKILL.md

Installable skill definition

Quality Score

90/100

Category

Automation

Supported Platforms

Universal

Our assessment of golang-concurrency

golang-concurrency scores 90/100 on our quality scale, 1021st of 3,055 Automation skills we index (top 34%).

Its SKILL.md is 9.3 KB long, well organised into 12 sections with 1 code example: a thorough specification that gives an agent plenty to work with.

With 3,324 GitHub stars, it is one of the more widely adopted skills in the catalogue.

Substance
29/30
Structure
17/20
Description
15/15
Adoption
15/20
Freshness
15/15

Maintenance, license and trust

  • The repository was last updated 25 days ago, so golang-concurrency is actively maintained.
  • It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
  • Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.

golang-concurrency compared with similar skills

All 4 of these similar skills score higher than golang-concurrency; compare them before choosing.

SkillScoreStarsUpdatedFormat
golang-concurrency (this skill)by samber903.3k25d agoSKILL.md
Agent-Reachby Panniantong10087.6k16d agoCLAUDE.md
rufloby ruvnet10073.7ktodayCLAUDE.md
Scraplingby D4Vinci10085.1k1d agoMCP Server
algorithmic-artby anthropics100177.9k9d agoSKILL.md

Frequently asked questions

How do I install golang-concurrency?
Run npx skills add samber/cc-skills-golang --skill golang-concurrency. The install tabs above show the steps for each supported agent.
Which AI agents does golang-concurrency work with?
It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
Is golang-concurrency safe to use?
It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
Is golang-concurrency still maintained?
The repository was last updated 25 days ago, so golang-concurrency is actively maintained.

name: golang-concurrency description: "Golang concurrency design — goroutine lifecycle and leak prevention, channels and select, channel ownership and direction, sync.Mutex/RWMutex/sync.Map/sync.Once/atomics, errgroup, singleflight, worker pools, and fan-out/fan-in pipelines. Use when writing or reviewing concurrent Go code, when choosing between channels and mutexes, when protecting a shared map or counter, or when a goroutine has no clear exit. Not for defensive coding unrelated to concurrency such as nil panics, slice aliasing, or numeric overflow (→ See samber/cc-skills-golang@golang-safety skill), and not for debugging a specific hung, crashing, or racing program after the fact (→ See samber/cc-skills-golang@golang-troubleshooting skill)." user-invocable: true license: MIT compatibility: Designed for Claude Code, Codex or similar harness, and for projects using Golang. metadata: author: samber version: "1.2.1" openclaw: emoji: "⚡" homepage: https://github.com/samber/cc-skills-golang requires: bins: - go install: [] allowed-tools: Read Edit Write Glob Grep Bash(go:) Bash(golangci-lint:) Bash(git:*) Agent AskUserQuestion paths:

  • "**/*.go"

Persona: You are a Go concurrency engineer. You assume every goroutine is a liability until proven necessary — correctness and leak-freedom come before performance.

Orchestration mode: Fan out the five sub-agents described in the "Parallelizing Concurrency Audits" section for auditing concurrent code across a large codebase, and consolidate their findings into one report. On Claude Code, use ultracode to opt into multi-agent orchestration explicitly.

Modes:

  • Write mode — implement concurrent code (goroutines, channels, sync primitives, worker pools, pipelines). Follow the sequential instructions below.
  • Review mode — reviewing a PR's concurrent code changes. Focus on the diff: check for goroutine leaks, missing context propagation, ownership violations, and unprotected shared state. Sequential.
  • Audit mode — auditing existing concurrent code across a codebase. Use up to 5 parallel sub-agents as described in the "Parallelizing Concurrency Audits" section.

Community default. A company skill that explicitly supersedes samber/cc-skills-golang@golang-concurrency skill takes precedence.

Go Concurrency Best Practices

Go's concurrency model is built on goroutines and channels. Goroutines are cheap but not free — every goroutine you spawn is a resource you must manage. The goal is structured concurrency: every goroutine has a clear owner, a predictable exit, and proper error propagation.

Core Principles

  1. Every goroutine must have a clear exit — without a shutdown mechanism (context, done channel, WaitGroup), they leak and accumulate until the process crashes
  2. Share memory by communicating — channels transfer ownership explicitly; mutexes protect shared state but make ownership implicit
  3. Send copies, not pointers on channels — sending pointers creates invisible shared memory, defeating the purpose of channels
  4. Only the sender closes a channel — closing from the receiver side panics if the sender writes after close
  5. Specify channel direction (chan<-, <-chan) — the compiler prevents misuse at build time
  6. Default to unbuffered channels — larger buffers mask backpressure; use them only with measured justification
  7. Always include ctx.Done() in select — without it, goroutines leak after caller cancellation
  8. Avoid repeated time.After in hot loops — each call allocates a timer and creates unnecessary churn; use time.NewTimer + Reset for long-running loops
  9. Track goroutine leaks in tests with go.uber.org/goleak

For detailed channel/select code examples, see Channels and Select Patterns.

Channel vs Mutex vs Atomic

| Scenario | Use | Why | | --- | --- | --- | | Passing data between goroutines | Channel | Communicates ownership transfer | | Coordinating goroutine lifecycle | Channel + context | Clean shutdown with select | | Protecting shared struct fields | sync.Mutex / sync.RWMutex | Simple critical sections | | Simple counters, flags | sync/atomic | Lock-free, lower overhead | | Many readers, few writers on a map | sync.Map | Optimized for read-heavy workloads. Concurrent map read/write causes a hard crash | | Caching expensive computations | sync.Once / singleflight | Execute once or deduplicate |

WaitGroup vs errgroup

| Need | Use | Why | | --- | --- | --- | | Wait for goroutines, errors not needed | sync.WaitGroup | Fire-and-forget | | Wait + collect first error | errgroup.Group | Error propagation | | Wait + cancel siblings on first error | errgroup.WithContext | Context cancellation on error | | Wait + limit concurrency | errgroup.SetLimit(n) | Built-in worker pool |

Sync Primitives Quick Reference

| Primitive | Use case | Key notes | | --- | --- | --- | | sync.Mutex | Protect shared state | Keep critical sections short; never hold across I/O | | sync.RWMutex | Many readers, few writers | Never upgrade RLock to Lock (deadlock) | | sync/atomic | Simple counters, flags | Prefer typed atomics (Go 1.19+): atomic.Int64, atomic.Bool | | sync.Map | Concurrent map, read-heavy | No explicit locking; use RWMutex+map when writes dominate | | sync.Pool | Reuse temporary objects | Always Reset() before Put(); reduces GC pressure | | sync.Once | One-time initialization | Go 1.21+: OnceFunc, OnceValue, OnceValues | | sync.WaitGroup | Waiting for simple goroutines | Go 1.25+: prefer wg.Go(func(){ ... }) for fire-and-wait tasks that do not panic and do not need error propagation. For Go <1.25 use Add/Done. For errors/cancellation/limits, use errgroup with context. | | x/sync/singleflight | Deduplicate concurrent calls | Cache stampede prevention | | x/sync/errgroup | Goroutine group + errors | SetLimit(n) replaces hand-rolled worker pools |

For detailed examples and anti-patterns, see Sync Primitives Deep Dive.

Concurrency Checklist

Before spawning a goroutine, answer:

  • [ ] How will it exit? — context cancellation, channel close, or explicit signal
  • [ ] Can I signal it to stop? — pass context.Context or done channel
  • [ ] Can I wait for it? — sync.WaitGroup or errgroup
  • [ ] Who owns the channels? — creator/sender owns and closes
  • [ ] Should this be synchronous instead? — don't add concurrency without measured need

Pipelines and Worker Pools

For pipeline patterns (fan-out/fan-in, bounded workers, generator chains, Go 1.23+ iterators, samber/ro), see Pipelines and Worker Pools.

Parallelizing Concurrency Audits

When auditing concurrency across a large codebase, use up to 5 parallel sub-agents:

  1. Find all goroutine spawns (go func, go method) and verify shutdown mechanisms
  2. Search for mutable globals and shared state without synchronization
  3. Audit channel usage — ownership, direction, closure, buffer sizes
  4. Find time.After in loops, missing ctx.Done() in select, unbounded spawning
  5. Check mutex usage, sync.Map, atomics, and thread-safety documentation

Common Mistakes

| Mistake | Fix | | --- | --- | | Fire-and-forget goroutine | Provide stop mechanism (context, done channel) | | Closing channel from receiver | Only the sender closes | | time.After in hot loop | Reuse time.NewTimer + Reset | | Missing ctx.Done() in select | Always select on context to allow cancellation | | Unbounded goroutine spawning | Use errgroup.SetLimit(n) or semaphore | | Sharing pointer via channel | Send copies or immutable values | | wg.Add inside goroutine | Call Add before go — Wait may return early otherwise | | Forgetting -race in CI | Always run go test -race ./... | | Mutex held across I/O | Keep critical sections short |

Cross-References

  • → See samber/cc-skills-golang@golang-performance skill for false sharing, cache-line padding, sync.Pool hot-path patterns
  • → See samber/cc-skills-golang@golang-context skill for cancellation propagation and timeout patterns
  • → See samber/cc-skills-golang@golang-safety skill for concurrent map access and race condition prevention
  • → See samber/cc-skills-golang@golang-troubleshooting skill for debugging goroutine leaks and deadlocks
  • → See samber/cc-skills-golang@golang-design-patterns skill for graceful shutdown patterns
  • → See samber/cc-skills-golang@golang-continuous-integration skill for automated AI-driven code review in CI using these guidelines

Goroutine leak profile

The goroutine leak profile (experimental behind GOEXPERIMENT=goroutineleakprofile in Go 1.26) is generally available in runtime/pprof since Go 1.27 — no build flag required. It is a useful production-oriented leak signal alongside the existing tools below.

curl http://localhost:6060/debug/pprof/goroutineleak?debug=2
go tool pprof http://localhost:6060/debug/pprof/goroutineleak

Keep existing tools:

  • tests: go.uber.org/goleak
  • runtime count: runtime.NumGoroutine()
  • stack dump: /debug/pprof/goroutine?debug=2
  • race checks: go test -race ./...

References

Related Skills

View on GitHub
GitHub Stars3.3k
CategoryAutomation
Updated25d ago
Forks218

Languages

Go

Trust signals

100/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

No cautions