Skills Agentes

Golang Design Patterns

Patrones idiomáticos de Go: functional options, constructores, flujo de errores, gestión de recursos, graceful shutdown, resiliencia, arquitectura e inyección de dependencias.

Solicitaread edit write glob grep bash(go:*) bash(golangci-lint:*) bash(git:*) agent askuserquestion
Estrellas
3k

en todo el repo

Actividad
57

0–100, la ruta de este skill

Actualizado
el mes pasado

último commit aquí

Commits
4

últimos 90 días

Contexto
2.9k tok

120 tok en reposo

Paquete
8 archivos

60 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add samber/cc-skills-golang --skill golang-design-patterns --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Aplica patrones idiomáticos de Go: functional options, constructores explícitos, manejo de errores con retorno temprano
  • Revisa código en busca de abuso de init(), recursos sin límite, timeouts faltantes y estado global implícito
  • Guía decisiones de arquitectura (clean, hexagonal, DDD, flat) preguntando antes de imponer un patrón
  • Propone patrones de resiliencia: timeouts en llamadas externas, reintentos con chequeo de contexto, streaming para datos grandes

Úsalo cuando

  • Al elegir explícitamente entre patrones arquitectónicos
  • Al implementar functional options o diseñar APIs de constructores
  • Al configurar graceful shutdown o aplicar patrones de resiliencia
  • Al preguntar qué patrón idiomático de Go encaja con un problema específico

No lo uses cuando

    Qué lo activa

    Di cualquiera de estas frases y el agente debería cargar este skill.

    • ¿Qué patrón de constructor debería usar para este servidor en Go?
    • Revisa este código Go en busca de problemas de diseño
    • Ayúdame a diseñar la arquitectura de este microservicio en Go
    • ¿Cómo implemento graceful shutdown en mi aplicación Go?

    SKILL.md

    En inglés

    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() / Flush() errors: read-only cleanup can often use defer f.Close(), but write/flush resources must report close or flush errors when durability matters

    Data Handling

    string vs []byte vs []rune

    Type Default for Use when
    string Everything Immutable, safe, UTF-8
    []byte I/O Writing to io.Writer, building strings, mutations
    []rune Unicode ops len() 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

    Guide Scope
    Architecture Patterns High-level principles, when each architecture fits
    Clean Architecture Use cases, dependency rule, layered adapters
    Hexagonal Architecture Ports and adapters, domain core isolation
    Domain-Driven Design Aggregates, 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
    • → See samber/cc-skills-golang@golang-refactoring skill for safely staging a migration toward one of these patterns (options struct, DI, consumer-side interfaces) across an existing codebase

    Reproducido de samber/cc-skills-golang bajo licencia MIT. Leer esta página en markdown.

    Archivos

    8 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

    Antes de instalar

    Requiere un proyecto en Golang con el binario go disponible.

    Detalles

    Creador
    samber
    Licencia
    MIT
    Recursos incluidos
    referencias
    Código fuente
    Ver SKILL.md

    Etiquetas

    Más de samber/cc-skills-golang

    Este repo incluye 46 skills. Si instalas uno, normalmente ya tienes los demás.

    Buenas prácticas de linting y configuración de golangci-lint para proyectos Golang: ejecutar linters, configurar .golangci.yml, suprimir avisos con nolint, interpretar salidas y elegir linters.

    Costo de contexto al activarse
    1.8k tok
    Tamaño del paquete
    5 archivos
    Última actualización
    hace 3 días
    herramientas desarrollo

    Benchmarking, profiling y medición de rendimiento en Golang: escribir y comparar benchmarks, perfilar con pprof, analizar con benchstat y detectar regresiones en CI.

    Costo de contexto al activarse
    3.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    hace 28 días
    testing qa

    Orquestador de skills de Golang, siempre activo en cualquier tarea de código, revisión, debug o setup: carga las skills más relevantes de samber/cc-skills-golang, a menudo varias a la vez.

    Costo de contexto al activarse
    3.8k tok
    Tamaño del paquete
    4 archivos
    Última actualización
    hace 20 días
    herramientas desarrollo

    Patrones y metodología de optimización de rendimiento en Golang: si hay cuello de botella X, aplica el patrón Y, una vez que profiling o benchmarks ya lo identificaron.

    Costo de contexto al activarse
    2.3k tok
    Tamaño del paquete
    9 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Tests de Golang listos para producción: table-driven, suites y mocks con testify, tests paralelos, fuzzing, fixtures, detección de fugas de goroutines con goleak, snapshot testing, cobertura, tests de integración.

    Costo de contexto al activarse
    4.4k tok
    Tamaño del paquete
    6 archivos
    Última actualización
    el mes pasado
    testing qa

    Inyección de dependencias en Golang con samber/do: contenedores de servicios, gestión de ciclo de vida, scopes, health checks, apagado ordenado y organización en módulos.

    Costo de contexto al activarse
    2.3k tok
    Tamaño del paquete
    4 archivos
    Última actualización
    hace 22 días
    herramientas desarrollo

    Skills relacionados

    Desarrollo de aplicaciones CLI en Go: estructura de comandos, flags, configuración por capas, versión embebida, exit codes, señales, completions y testing con cobra, viper o urfave/cli.

    Costo de contexto al activarse
    2.6k tok
    Tamaño del paquete
    14 archivos
    Última actualización
    hace 3 meses
    herramientas desarrollo

    Convenciones de estilo en Golang: longitud y corte de líneas, declaración de variables, claridad del control de flujo y cuándo los comentarios ayudan u estorban.

    Costo de contexto al activarse
    2.5k tok
    Tamaño del paquete
    3 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Patrones de concurrencia en Go: úsalo al escribir o revisar código concurrente con goroutines, channels, select, locks, sync primitives, errgroup, singleflight, worker pools o pipelines fan-out/fan-in.

    Costo de contexto al activarse
    2.3k tok
    Tamaño del paquete
    5 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo