Source profileQuality 97/100

omarluq/librecode/.librecode/skills/golang-design-patterns/SKILL.md

golang-design-patterns

Idiomatic Golang design patterns — functional options, constructors, error flow and cascading, resource management and lifecycle, graceful shutdown, resilience, architecture, dependency injection, data handling, and streaming. Apply when designing Go APIs, structuring applications, choosing between patterns, making design decisions, architectural choices, or production hardening.

Source repository stars
29
Declared platforms
1
Static risk flags
0
Last source update
2026-08-25
Source checked
2026-08-25

Decision brief

What it does: where it fits

Idiomatic Go patterns for production-ready code. For error handling details see the samber/cc-skills-golang@golang-error-handling skill; for context propagation see samber/cc-skills-golang@golang-context skill; for struct/interface design see samber/cc-skills-golang@golang-struc…

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeDeclaredSource recordInstall path and trigger
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/omarluq/librecode --skill ".librecode/skills/golang-design-patterns"
    Safe inspection promptEditorial

    Inspect the Agent Skill "golang-design-patterns" from https://github.com/omarluq/librecode/blob/55976d67b4363001b349a5adb9f9b87b27d0bfcd/.librecode/skills/golang-design-patterns/SKILL.md at commit 55976d67b4363001b349a5adb9f9b87b27d0bfcd. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Best Practices Summary

      1. Constructors SHOULD use functional options — they scale better as APIs evolve (one function per option, no breaking changes) 2. Functional options MUST return an error if validation can fail — catch bad config at construction, not at runtime 3. Avoid init() — runs implicitly,…

      Constructors SHOULD use functional options — they scale better as APIs evolve (one function per option, no breaking changes)Functional options MUST return an error if validation can fail — catch bad config at construction, not at runtimeAvoid init() — runs implicitly, cannot return errors, makes testing unpredictable. Use explicit constructors
    2. 02

      Constructor Patterns: Functional Options vs Builder

      Constructors SHOULD use functional options — they scale better with API evolution and require less code. Use builder pattern only if you need complex validation between configuration steps.

      Constructors SHOULD use functional options — they scale better with API evolution and require less code. Use builder pattern only if you need complex validation between configuration steps.
    3. 03

      Functional Options (Preferred)

      Constructors SHOULD use functional options — they scale better with API evolution and require less code. Use builder pattern only if you need complex validation between configuration steps.

      Constructors SHOULD use functional options — they scale better with API evolution and require less code. Use builder pattern only if you need complex validation between configuration steps.
    4. 04

      Constructors & Initialization

      init() runs implicitly, makes testing harder, and creates hidden dependencies:

      Multiple init() functions run in declaration order, across files in filename alphabetical order — fragileCannot return errors — failures must panic or log.FatalRuns before main() and tests — side effects make tests unpredictable
    5. 05

      Avoid init() and Mutable Globals

      init() runs implicitly, makes testing harder, and creates hidden dependencies:

      Multiple init() functions run in declaration order, across files in filename alphabetical order — fragileCannot return errors — failures must panic or log.FatalRuns before main() and tests — side effects make tests unpredictable

    Permission review

    Static risk signals and limitations

    No configured static risk pattern was detected

    This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score97/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars29SourceRepository attention, not individual Skill quality
    Compatibility1 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    omarluq/librecode
    Skill path
    .librecode/skills/golang-design-patterns/SKILL.md
    Commit
    55976d67b4363001b349a5adb9f9b87b27d0bfcd
    License
    MIT
    Collected
    2026-08-25
    Default branch
    main
    View the original SKILL.md

    Persona: You are a Go architect who values simplicity and explicitness. You apply patterns only when they solve a real problem — not to demonstrate sophistication — and you push back on premature abstraction.

    Modes:

    • Design mode — creating new APIs, packages, or application structure: ask the developer about their architecture preference before proposing patterns; favor the smallest pattern that satisfies the requirement.
    • Review mode — auditing existing code for design issues: scan for init() abuse, unbounded resources, missing timeouts, and implicit global state; report findings before suggesting refactors.

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

    Go Design Patterns & Idioms

    Idiomatic Go patterns for production-ready code. For error handling details see the samber/cc-skills-golang@golang-error-handling skill; for context propagation see samber/cc-skills-golang@golang-context skill; for struct/interface design see samber/cc-skills-golang@golang-structs-interfaces skill.

    Best Practices Summary

    1. Constructors SHOULD use functional options — they scale better as APIs evolve (one function per option, no breaking changes)
    2. Functional options MUST return an error if validation can fail — catch bad config at construction, not at runtime
    3. Avoid init() — runs implicitly, cannot return errors, makes testing unpredictable. Use explicit constructors
    4. Enums SHOULD start at 1 (or Unknown sentinel at 0) — Go's zero value silently passes as the first enum member
    5. Error cases MUST be handled first with early return — keep happy path flat
    6. Panic is for bugs, not expected errors — callers can handle returned errors; panics crash the process
    7. defer Close() immediately after opening — later code changes can accidentally skip cleanup
    8. runtime.AddCleanup over runtime.SetFinalizer — finalizers are unpredictable and can resurrect objects
    9. Every external call SHOULD have a timeout — a slow upstream hangs your goroutine indefinitely
    10. Limit everything (pool sizes, queue depths, buffers) — unbounded resources grow until they crash
    11. Retry logic MUST check context cancellation between attempts
    12. Use strings.Builder for concatenation in loops → see samber/cc-skills-golang@golang-code-style
    13. string vs []byte: use []byte for mutation and I/O, string for display and keys — conversions allocate
    14. Iterators (Go 1.23+): use for lazy evaluation — avoid loading everything into memory
    15. Stream large transfers — loading millions of rows causes OOM; stream keeps memory constant
    16. //go:embed for static assets — embeds at compile time, eliminates runtime file I/O errors
    17. Use crypto/rand for keys/tokens — math/rand is predictable → see samber/cc-skills-golang@golang-security
    18. Regexp MUST be compiled once at package level — compilation is O(n) and allocates
    19. Compile-time interface checks: var _ Interface = (*Type)(nil)
    20. A little recode > a big dependency — each dep adds attack surface and maintenance burden
    21. Design for testability — accept interfaces, inject dependencies

    Constructor Patterns: Functional Options vs Builder

    Functional Options (Preferred)

    type Server struct {
        addr         string
        readTimeout  time.Duration
        writeTimeout time.Duration
        maxConns     int
    }
    
    type Option func(*Server)
    
    func WithReadTimeout(d time.Duration) Option {
        return func(s *Server) { s.readTimeout = d }
    }
    
    func WithWriteTimeout(d time.Duration) Option {
        return func(s *Server) { s.writeTimeout = d }
    }
    
    func WithMaxConns(n int) Option {
        return func(s *Server) { s.maxConns = n }
    }
    
    func NewServer(addr string, opts ...Option) *Server {
        // Default options
        s := &Server{
            addr:         addr,
            readTimeout:  5 * time.Second,
            writeTimeout: 10 * time.Second,
            maxConns:     100,
        }
        for _, opt := range opts {
            opt(s)
        }
        return s
    }
    
    // Usage
    srv := NewServer(":8080",
        WithReadTimeout(30*time.Second),
        WithMaxConns(500),
    )
    

    Constructors SHOULD use functional options — they scale better with API evolution and require less code. Use builder pattern only if you need complex validation between configuration steps.

    Constructors & Initialization

    Avoid init() and Mutable Globals

    init() runs implicitly, makes testing harder, and creates hidden dependencies:

    • Multiple init() functions run in declaration order, across files in filename alphabetical order — fragile
    • Cannot return errors — failures must panic or log.Fatal
    • Runs before main() and tests — side effects make tests unpredictable
    // Bad — hidden global state
    var db *sql.DB
    
    func init() {
        var err error
        db, err = sql.Open("postgres", os.Getenv("DATABASE_URL"))
        if err != nil {
            log.Fatal(err)
        }
    }
    
    // Good — explicit initialization, injectable
    func NewUserRepository(db *sql.DB) *UserRepository {
        return &UserRepository{db: db}
    }
    

    Enums: Start at 1

    Zero values should represent invalid/unset state:

    type Status int
    
    const (
        StatusUnknown Status = iota // 0 = invalid/unset
        StatusActive                // 1
        StatusInactive              // 2
        StatusSuspended             // 3
    )
    

    Compile Regexp Once

    // Good — compiled once at package level
    var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
    
    func ValidateEmail(email string) bool {
        return emailRegex.MatchString(email)
    }
    

    Use //go:embed for Static Assets

    import "embed"
    
    //go:embed templates/*
    var templateFS embed.FS
    
    //go:embed version.txt
    var version string
    

    Compile-Time Interface Checks

    → See samber/cc-skills-golang@golang-structs-interfaces for the var _ Interface = (*Type)(nil) pattern.

    Error Flow Patterns

    Error cases MUST be handled first with early return — keep the happy path at minimal indentation. → See samber/cc-skills-golang@golang-code-style for the full pattern and examples.

    When to Panic vs Return Error

    • Return error: network failures, file not found, invalid input — anything a caller can handle
    • Panic: nil pointer in a place that should be impossible, violated invariant, Must* constructors used at init time
    • .Close() errors: acceptable to not check — defer f.Close() is fine without error handling

    Data Handling

    string vs []byte vs []rune

    TypeDefault forUse when
    stringEverythingImmutable, safe, UTF-8
    []byteI/OWriting to io.Writer, building strings, mutations
    []runeUnicode opslen() must mean characters, not bytes

    Avoid repeated conversions — each one allocates. Stay in one type until you need the other.

    Iterators & Streaming for Large Data

    Use iterators (Go 1.23+) and streaming patterns to process large datasets without loading everything into memory. For large transfers between services (e.g., 1M rows DB to HTTP), stream to prevent OOM.

    For code examples, see Data Handling Patterns.

    Resource Management

    defer Close() immediately after opening — don't wait, don't forget:

    f, err := os.Open(path)
    if err != nil {
        return err
    }
    defer f.Close() // right here, not 50 lines later
    
    rows, err := db.QueryContext(ctx, query)
    if err != nil {
        return err
    }
    defer rows.Close()
    

    For graceful shutdown, resource pools, and runtime.AddCleanup, see Resource Management.

    Resilience & Limits

    Timeout Every External Call

    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()
    
    resp, err := httpClient.Do(req.WithContext(ctx))
    

    Retry & Context Checks

    Retry logic MUST check ctx.Err() between attempts and use exponential/linear backoff via select on ctx.Done(). Long loops MUST check ctx.Err() periodically. → See samber/cc-skills-golang@golang-context skill.

    Database Patterns

    → See samber/cc-skills-golang@golang-database skill for sqlx/pgx, transactions, nullable columns, connection pools, repository interfaces, testing.

    Architecture

    Ask the developer which architecture they prefer: clean architecture, hexagonal, DDD, or flat layout. Don't impose complex architecture on a small project.

    Core principles regardless of architecture:

    • Keep domain pure — no framework dependencies in the domain layer
    • Fail fast — validate at boundaries, trust internal code
    • Make illegal states unrepresentable — use types to enforce invariants
    • Respect 12-factor app principles — → see samber/cc-skills-golang@golang-project-layout

    Detailed Guides

    GuideScope
    Architecture PatternsHigh-level principles, when each architecture fits
    Clean ArchitectureUse cases, dependency rule, layered adapters
    Hexagonal ArchitecturePorts and adapters, domain core isolation
    Domain-Driven DesignAggregates, value objects, bounded contexts

    Code Philosophy

    • Avoid repetitive code — but don't abstract prematurely
    • Minimize dependencies — a little recode > a big dependency
    • Design for testability — accept interfaces, inject dependencies, keep functions pure

    Cross-References

    • → See samber/cc-skills-golang@golang-data-structures skill for data structure selection, internals, and container/ packages
    • → See samber/cc-skills-golang@golang-error-handling skill for error wrapping, sentinel errors, and the single handling rule
    • → See samber/cc-skills-golang@golang-structs-interfaces skill for interface design and composition
    • → See samber/cc-skills-golang@golang-concurrency skill for goroutine lifecycle and graceful shutdown
    • → See samber/cc-skills-golang@golang-context skill for timeout and cancellation patterns
    • → See samber/cc-skills-golang@golang-project-layout skill for architecture and directory structure

    Frequently asked questions

    What to verify before installation and use

    What does the golang-design-patterns source document cover?

    Idiomatic Go patterns for production-ready code. For error handling details see the samber/cc-skills-golang@golang-error-handling skill; for context propagation see samber/cc-skills-golang@golang-context skill; for struct/interface design see samber/cc-skills-golang@golang-struc…

    How do I install golang-design-patterns?

    The source record exposes this install command: npx skills add https://github.com/omarluq/librecode --skill ".librecode/skills/golang-design-patterns". Inspect the command and pinned source before running it.

    Which Agent platforms does the source record declare?

    The pinned source record declares support for: claude code.

    Alternatives

    Compare before choosing

    Computed 973,066

    samber/cc-skills-golang

    golang-design-patterns

    Idiomatic Golang design patterns — functional options, constructors, error flow and cascading, resource management and lifecycle, graceful shutdown, resilience, architecture, dependency injection, data handling, streaming, and more. Apply when explicitly choosing between architectural patterns, implementing functional options, designing constructor APIs, setting up graceful shutdown, applying resilience patterns, or asking which idiomatic Go pattern fits a specific problem.

    Computed 100147

    oaustegard/claude-skills

    featuring

    Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre

    Computed 1008

    narrative-io/narrative-skills-marketplace

    design-analysis

    Translate a fuzzy analytical question into a rigorous investigation plan. Interrogates the ask, grounds the plan in the available data dictionary, applies analytical best practices, and produces a structured brief of query specifications for a downstream query-writing skill. Plans, does not write SQL. Use when: "why did X drop", "is there a relationship between A and B", "who are our highest-value customers", "what's driving the change in Y", "investigate this trend", "design an analysis for", "

    Computed 9980

    vasilyu1983/AI-Agents-public

    qa-testing-ios

    Guides iOS testing with XCTest, XCUITest, Swift Testing, simctl, and xcresult. Use when choosing destinations, controlling flakes, or parsing test artifacts for native apps.