算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
)\n\nfunc ValidateEmail(email string) bool {\n return emailRegex.MatchString(email)\n}\n```\n\n### Use `//go:embed` for Static Assets\n\n```go\nimport \"embed\"\n\n//go:embed templates/*\nvar templateFS embed.FS\n\n//go:embed version.txt\nvar version string\n```\n\n### Compile-Time Interface Checks\n\n→ See `samber/cc-skills-golang@golang-structs-interfaces` for the `var _ Interface = (*Type)(nil)` pattern.\n\n## Error Flow Patterns\n\nError 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.\n\n### When to Panic vs Return Error\n\n- **Return error**: network failures, file not found, invalid input — anything a caller can handle\n- **Panic**: nil pointer in a place that should be impossible, violated invariant, `Must*` constructors used at init time\n- **`.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\n\n## Data Handling\n\n### string vs []byte vs []rune\n\n| Type | Default for | Use when |\n| -------- | ----------- | --------------------------------------------------- |\n| `string` | Everything | Immutable, safe, UTF-8 |\n| `[]byte` | I/O | Writing to `io.Writer`, building strings, mutations |\n| `[]rune` | Unicode ops | `len()` must mean characters, not bytes |\n\nAvoid repeated conversions — each one allocates. Stay in one type until you need the other.\n\n### Iterators & Streaming for Large Data\n\nUse 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.\n\nFor code examples, see [Data Handling Patterns](references/data-handling.md).\n\n## Resource Management\n\n`defer Close()` immediately after opening — don't wait, don't forget:\n\n```go\nf, err := os.Open(path)\nif err != nil {\n return err\n}\ndefer f.Close() // right here, not 50 lines later\n\nrows, err := db.QueryContext(ctx, query)\nif err != nil {\n return err\n}\ndefer rows.Close()\n```\n\nFor graceful shutdown, resource pools, and `runtime.AddCleanup`, see [Resource Management](references/resource-management.md).\n\n## Resilience & Limits\n\n### Timeout Every External Call\n\n```go\nctx, cancel := context.WithTimeout(ctx, 5*time.Second)\ndefer cancel()\n\nresp, err := httpClient.Do(req.WithContext(ctx))\n```\n\n### Retry & Context Checks\n\nRetry 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.\n\n## Database Patterns\n\n→ See `samber/cc-skills-golang@golang-database` skill for sqlx/pgx, transactions, nullable columns, connection pools, repository interfaces, testing.\n\n## Architecture\n\nAsk the developer which architecture they prefer: clean architecture, hexagonal, DDD, or flat layout. Don't impose complex architecture on a small project.\n\nCore principles regardless of architecture:\n\n- **Keep domain pure** — no framework dependencies in the domain layer\n- **Fail fast** — validate at boundaries, trust internal code\n- **Make illegal states unrepresentable** — use types to enforce invariants\n- **Respect 12-factor app** principles — → see `samber/cc-skills-golang@golang-project-layout`\n\n## Detailed Guides\n\n| Guide | Scope |\n| --- | --- |\n| [Architecture Patterns](references/architecture.md) | High-level principles, when each architecture fits |\n| [Clean Architecture](references/clean-architecture.md) | Use cases, dependency rule, layered adapters |\n| [Hexagonal Architecture](references/hexagonal-architecture.md) | Ports and adapters, domain core isolation |\n| [Domain-Driven Design](references/ddd.md) | Aggregates, value objects, bounded contexts |\n\n## Code Philosophy\n\n- **Avoid repetitive code** — but don't abstract prematurely\n- **Minimize dependencies** — a little recode > a big dependency\n- **Design for testability** — accept interfaces, inject dependencies, keep functions pure\n\n## Cross-References\n\n- → See `samber/cc-skills-golang@golang-data-structures` skill for data structure selection, internals, and container/ packages\n- → See `samber/cc-skills-golang@golang-error-handling` skill for error wrapping, sentinel errors, and the single handling rule\n- → See `samber/cc-skills-golang@golang-structs-interfaces` skill for interface design and composition\n- → See `samber/cc-skills-golang@golang-concurrency` skill for goroutine lifecycle and graceful shutdown\n- → See `samber/cc-skills-golang@golang-context` skill for timeout and cancellation patterns\n- → See `samber/cc-skills-golang@golang-project-layout` skill for architecture and directory structure\n- → 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\n","licenseDocuments":[]}}
golang-design-patterns【设计与创意】Idiomatic Golang design patterns — functional options, constructor APIs, `init()` and global-state avoidance, enums, panic vs error decisions, resource management and lifecycle, graceful shutdown, timeouts and retries, streaming and iterators, and architecture styles (clean, hexagonal, DDD, flat). Apply when choosing between architectural patterns, i…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: golang-design-patterns
description: "Idiomatic Golang design patterns — functional options, constructor APIs, init() and global-state avoidance, enums, panic vs error decisions, resource management and lifecycle, graceful shutdown, timeouts and retries, streaming and iterators, and architecture styles (clean, hexagonal, DDD, flat). Apply when 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. Not for wiring a DI container or comparing DI libraries (→ See samber/cc-skills-golang@golang-dependency-injection skill), nor for error wrapping, errors.Is/As, or logging mechanics (→ See samber/cc-skills-golang@golang-error-handling 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:
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:
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-patternsskill takes precedence.
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.
init() — runs implicitly, cannot return errors, makes testing unpredictable. Use explicit constructorsdefer Close() immediately after opening — later code changes can accidentally skip cleanupruntime.AddCleanup over runtime.SetFinalizer — finalizers are unpredictable and can resurrect objectsstrings.Builder for concatenation in loops → see samber/cc-skills-golang@golang-code-style[]byte for mutation and I/O, string for display and keys — conversions allocate//go:embed for static assets — embeds at compile time, eliminates runtime file I/O errorscrypto/rand for keys/tokens — math/rand is predictable → see samber/cc-skills-golang@golang-securityvar _ Interface = (*Type)(nil)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.
init() and Mutable Globalsinit() runs implicitly, makes testing harder, and creates hidden dependencies:
init() functions run in declaration order, across files in filename alphabetical order — fragilelog.Fatalmain() 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}
}
Zero values should represent invalid/unset state:
type Status int
const (
StatusUnknown Status = iota // 0 = invalid/unset
StatusActive // 1
StatusInactive // 2
StatusSuspended // 3
)
// Good — compiled once at package level
var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
golang-design-patterns · Skills-SI 市场
)
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 stringEverything Immutable, safe, UTF-8 []byteI/O Writing to io.Writer, building strings, mutations []runeUnicode 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