golang-patterns
- Repo stars 0
- Author repo skills-registry
Golang Patterns
Idiomatic Go reference pack — concurrency, interfaces, generics, testing, project structure, plus the anti-patterns agents most commonly get wrong. Two-thesis stack:
- Clear is better than clever. Boring, explicit, maintainable Go (Jon Bodner, Learning Go, 2nd ed.).
- Production-grade by default. Bounded goroutine lifetimes, context threading, race-detector-clean tests, gofmt + golangci-lint on every change.
Reference Guide
Load detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| Concurrency | references/concurrency.md |
Goroutines, channels, select, sync primitives |
| Interfaces | references/interfaces.md |
Interface design, io.Reader/Writer, composition |
| Generics | references/generics.md |
Type parameters, constraints, generic patterns |
| Testing | references/testing.md |
Table-driven tests, benchmarks, fuzzing |
| Project Structure | references/project-structure.md |
Module layout, internal packages, go.mod |
| Idiomatic Go (anti-patterns) | references/idiomatic-go.md |
Quick anti-pattern → idiomatic-fix tables, decision rules, agent-specific rationalization counters |
Core Workflow
- Analyze architecture — Review module structure, interfaces, and concurrency patterns
- Design interfaces — Small, focused, defined at the consumer; composition over inheritance
- Implement — Idiomatic Go with proper error handling and context propagation; run
go vet ./...before proceeding - Lint & validate — Run
golangci-lint runand fix all reported issues before proceeding - Optimize — Profile with pprof, write benchmarks, eliminate allocations
- Test — Table-driven tests with
-race, fuzzing, 80%+ coverage; race detector must pass before committing
Core Pattern Example
Goroutine with context cancellation and error propagation:
// worker runs until ctx is cancelled or an error occurs.
// Errors are returned via errCh; the caller must drain it.
func worker(ctx context.Context, jobs <-chan Job, errCh chan<- error) {
for {
select {
case <-ctx.Done():
errCh <- fmt.Errorf("worker cancelled: %w", ctx.Err())
return
case job, ok := <-jobs:
if !ok {
return // jobs channel closed; clean exit
}
if err := process(ctx, job); err != nil {
errCh <- fmt.Errorf("process job %v: %w", job.ID, err)
return
}
}
}
}
func runPipeline(ctx context.Context, jobs []Job) error {
ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
defer cancel()
jobCh := make(chan Job, len(jobs))
errCh := make(chan error, 1)
go worker(ctx, jobCh, errCh)
for _, j := range jobs {
jobCh <- j
}
close(jobCh)
select {
case err := <-errCh:
return err
case <-ctx.Done():
return fmt.Errorf("pipeline timed out: %w", ctx.Err())
}
}
Key properties: bounded goroutine lifetime via ctx, error propagation with
%w, no goroutine leak on cancellation.
Constraints
MUST DO
- Run gofmt and golangci-lint on all code
- Add
context.Contextas first param on all blocking operations - Handle every error explicitly (no naked
_discards without justification) - Write table-driven tests with subtests
- Document all exported functions, types, and packages
- Use
X | Yunion constraints for generics (Go 1.18+) - Propagate errors with
fmt.Errorf("...: %w", err) - Run race detector on tests (
-raceflag)
MUST NOT DO
- Ignore errors (no
_ = thatMightFail()without a comment) - Use
panicfor normal error handling - Spawn goroutines without a clear lifecycle
- Skip context cancellation handling
- Reach for reflection without a measured performance reason
- Mix sync and async patterns carelessly
- Hardcode configuration (functional options or env vars)
Output Templates
When implementing Go features, provide:
- Interface definitions (contracts first)
- Implementation files with proper package structure
- Test file with table-driven tests
- Brief explanation of any concurrency patterns used
Pairing
golang-proagent — broader architectural / DevOps coverage; delegates pattern detail here. Load both when active Go development is in scope.
Provenance
Initial content adapted from
jeffallan/claude-skills (MIT,
skills/golang-pro) and the prior wardrobe idiomatic-go skill (Bodner-derived
anti-pattern tables, now at references/idiomatic-go.md). See LICENSES.md.
<!-- tomevault:4.0:skill_md:2026-05-23 -->Source: danmestas/wardrobe — distributed by TomeVault.
- Fluxly category
- Other
- Author-declared agents
- No explicit declaration found; this is not inferred or tested compatibility
- Static check
- 88 / 100 · heuristic scan, not runtime safety proof
- Author / version / license
- @tomevault-io · no license declared
- Fluxly token estimate
- Lean
- Fluxly setup estimate
- Guided setup
- External API key
- No requirement detected
- Detected OS requirements
- Unspecified
- Runtime requirements
- Unspecified
- Detected file/system behavior
-
- Read-only
- Write / modify
- Shell exec
- Env read
- Detected network behavior
- Local-only
- Install commands
- None (reference only)
Profile is derived at build time from SKILL.md and install vectors. Subject to drift from author intent.
Heads up: 未限定 allowed-tools,默认拥有全部工具权限。
# Core Pattern Example
// worker runs until ctx is cancelled or an error occurs.
// Errors are returned via errCh; the caller must drain it.
func worker(ctx context.Context, jobs <-chan Job, errCh chan<- error) {
for {
select {
case <-ctx.Done():
errCh <- fmt.Errorf("worker cancelled: %w", ctx.Err())
return
case job, ok := <-jobs:
if !ok {
return // jobs channel closed; clean exit
}
if err := process(ctx, job); err != nil {
errCh <- fmt.Errorf("process job %v: %w", job.ID, err)
return
}
}
}
}
func runPipeline(ctx context.Context, jobs []Job) error {
ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
defer cancel()
jobCh := make(chan Job, len(jobs))
errCh := make(chan error, 1)
go worker(ctx, jobCh, errCh)
for _, j := range jobs {
jobCh <- j
}
close(jobCh)
select {
case err := <-errCh:
return err
case <-ctx.Done():
return fmt.Errorf("pipeline timed out: %w", ctx.Err())
}
} Load detailed guidance based on context: Topic · Reference · Load When Concurrency · references/concurrency.md · Goroutines, channels, select, sync primitives
Analyze architecture — Review module structure, interfaces, and concurrency patterns Design interfaces — Small, focused, defined at the consumer; composition over inheritance Implement — Idiomatic Go with proper error handling and context propagation; run go…
Goroutine with context cancellation and error propagation: Key properties: bounded goroutine lifetime via ctx, error propagation with %w, no goroutine leak on cancellation.
Constraints
Run gofmt and golangci-lint on all code Add context.Context as first param on all blocking operations Handle every error explicitly (no naked discards without justification)
Ignore errors (no = thatMightFail() without a comment) Use panic for normal error handling Spawn goroutines without a clear lifecycle
# Golang Patterns
Idiomatic Go reference pack — concurrency, interfaces, generics, testing,
project structure, plus the anti-patterns agents most commonly get wrong.
Two-thesis stack:
- **Clear is better than clever.** Boring, explicit, maintainable Go (Jon Bodner,
*Learning Go*, 2nd ed.).
- **Production-grade by default.** Bounded goroutine lifetimes, context
threading, race-detector-clean tests, gofmt + golangci-lint on every change.
## Reference Guide
Load detailed guidance based on context:
| Topic | Reference | Load When |
|-------|-----------|-----------|
| Concurrency | `references/concurrency.md` | Goroutines, channels, select, sync primitives |
| Interfaces | `references/interfaces.md` | Interface design, io.Reader/Writer, composition |
| Generics | `references/generics.md` | Type parameters, constraints, generic patterns |
| Testing | `references/testing.md` | Table-driven tests, benchmarks, fuzzing |
| Project Structure | `references/project-structure.md` | Module layout, internal packages, go.mod |
| Idiomatic Go (anti-patterns) | `references/idiomatic-go.md` | Quick anti-pattern → idiomatic-fix tables, decision rules, agent-specific rationalization counters |
## Core Workflow
1. **Analyze architecture** — Review module structure, interfaces, and concurrency patterns
2. **Design interfaces** — Small, focused, defined at the consumer; composition over inheritance
3. **Implement** — Idiomatic Go with proper error handling and context propagation; run `go vet ./...` before proceeding
4. **Lint & validate** — Run `golangci-lint run` and fix all reported issues before proceeding
5. **Optimize** — Profile with pprof, write benchmarks, eliminate allocations
… Author text anchors workflow facts; Fluxly only indexes current sections, terms, files, and commands.
sections -> Reference Guide → Core Workflow → Core Pattern Example → Constraints → MUST DO → MUST NOT DO
terms -> Clear is better than clever. · Production-grade by default. · Analyze architecture · Design interfaces · Implement · Lint & validate · Optimize · Test
files/cmd -> references/concurrency.md · references/interfaces.md · references/generics.md · references/testing.md · references/project-structure.md · references/idiomatic-go.md · go vet ./... · golangci-lint run
body sha256 -> c1fc7daca612
Decide Fit First
Design Intent
How To Use It
Boundaries And Review