Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
cxuu avatar

Go Generics

  • 665 installs
  • 137 repo stars
  • Updated June 20, 2026
  • cxuu/golang-skills

go-generics is a Claude Code skill that provides precise guidance on when and how to apply Go generics, constraints, and type parameters for developers writing reusable Go 1.18+ backend and utility code.

About

go-generics from cxuu/golang-skills helps developers decide when to use Go generics versus concrete types or interfaces when writing generic functions, types, and constraints in Go 1.18 or later. The skill routes constraint composition questions to references/CONSTRAINTS.md and advises starting with concrete types before generalizing only when multiple types share real behavior. Developers reach for go-generics when choosing constraints, comparing type aliases to type definitions, or writing utility functions that could work across multiple Go types even if generics are not explicitly mentioned. Interface design without generics is explicitly deferred to the go-interfaces sibling skill.

  • Decision flow that starts with concrete types and generalizes only on second similar type
  • Clear rules for when to prefer generics versus interfaces or any+type switches
  • References CONSTRAINTS.md for type sets and constraint composition
  • Compatibility note that generics require Go 1.18+
  • Anti-pattern guardrails that stop premature abstraction

Go Generics by the numbers

  • 665 all-time installs (skills.sh)
  • Ranked #556 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cxuu/golang-skills --skill go-generics

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs665
repo stars137
Last updatedJune 20, 2026
Repositorycxuu/golang-skills

When should Go code use generics?

Get precise guidance on when and how to apply Go generics instead of concrete types or interfaces.

Who is it for?

Go developers on Go 1.18+ writing reusable utility functions or shared data structures who need constraint and type-parameter guidance.

Skip if: Teams on Go versions below 1.18 or developers needing interface-only design patterns without type parameters.

When should I use this skill?

The user writes Go utility functions, asks about generics, constraints, type aliases, or type definitions in Go code.

What you get

Go generic function or type implementation with appropriate constraints, or a concrete-type recommendation with rationale.

  • Generic Go function or type implementation
  • Constraint composition guidance

Files

SKILL.mdMarkdownGitHub ↗

Go Generics and Type Parameters

Compatibility: Generics require Go 1.18+.

Resource Routing

  • references/CONSTRAINTS.md - Read when composing constraints, using type sets, or choosing between generics and interfaces.

When to Use Generics

Start with concrete types. Generalize only when a second type appears.

Prefer Generics When

  • Multiple types share identical logic (sorting, filtering, map/reduce)
  • You would otherwise rely on any and excessive type switching
  • You are building a reusable data structure (concurrent-safe set, ordered map)

Avoid Generics When

  • Only one type is being instantiated in practice
  • Interfaces already model the shared behavior cleanly
  • The generic code is harder to read than the type-specific alternative
"Write code, don't design types." — Robert Griesemer and Ian Lance Taylor

Decision Flow

Do multiple types share identical logic?
├─ No  → Use concrete types
├─ Yes → Do they share a useful interface?
│        ├─ Yes → Use an interface
│        └─ No  → Use generics

Bad:

// Premature generics: only ever called with int
func Sum[T constraints.Integer | constraints.Float](vals []T) T {
    var total T
    for _, v := range vals {
        total += v
    }
    return total
}

Good:

func SumInts(vals []int) int {
    var total int
    for _, v := range vals {
        total += v
    }
    return total
}

---

Type Parameter Naming

NameTypical Use
TGeneral type parameter
KMap key type
VMap value type
EElement/item type

For complex constraints, a short descriptive name is acceptable:

func Marshal[Opts encoding.MarshalOptions](v any, opts Opts) ([]byte, error)

---

Type Aliases vs Type Definitions

Type aliases (type Old = new.Name) are rare — use only for package migration or gradual API refactoring.

---

Constraint Composition

Combine constraints with ~ (underlying type) and | (union):

type Numeric interface {
    ~int | ~int8 | ~int16 | ~int32 | ~int64 |
    ~float32 | ~float64
}

func Sum[T Numeric](vals []T) T {
    var total T
    for _, v := range vals {
        total += v
    }
    return total
}

Use the constraints package or cmp package (Go 1.21+) for standard constraints like cmp.Ordered instead of writing your own.

---

Common Pitfalls

Don't Wrap Standard Library Types

// Bad: generic wrapper adds complexity without value
type Set[T comparable] struct {
    m map[T]struct{}
}

// Better: use map[T]struct{} directly when the usage is simple
seen := map[string]struct{}{}

Generics justify their complexity when they eliminate duplication across multiple call sites. A single-use generic is just indirection.

Don't Use Generics for Interface Satisfaction

// Bad: T is only used to satisfy an interface — just use the interface
func Process[T io.Reader](r T) error { ... }

// Good: accept the interface directly
func Process(r io.Reader) error { ... }

Avoid Over-Constraining

// Bad: constraint is more restrictive than needed
func Contains[T interface{ ~int | ~string }](slice []T, target T) bool { ... }

// Good: comparable is sufficient
func Contains[T comparable](slice []T, target T) bool { ... }

---

Quick Reference

TopicGuidance
When to use genericsOnly when multiple types share identical logic and interfaces don't suffice
Starting pointWrite concrete code first; generalize later
NamingSingle uppercase letter (T, K, V, E)
Type aliasesSame type, alternate name; use only for migration
Constraint compositionUse ~ for underlying types, `
Common pitfallDon't genericize single-use code or when interfaces suffice

---

Related Skills

  • Interfaces vs generics: See go-interfaces when deciding whether an interface already models the shared behavior without generics
  • Type declarations: See go-declarations when defining new types, type aliases, or choosing between type definitions and aliases
  • Documenting generic APIs: See go-documentation when writing doc comments and runnable examples for generic functions
  • Naming type parameters: See go-naming when choosing names for type parameters or constraint interfaces

Related skills

How it compares

Choose go-generics for type-parameter decisions in Go 1.18+ rather than interface-only abstraction patterns covered by go-interfaces.

FAQ

What Go version does go-generics require?

go-generics requires Go 1.18 or later because type parameters and generics were introduced in that release. The skill guides generic functions, constraints, and type alias decisions for backend and utility Go code.

When does go-generics recommend using generics?

go-generics advises starting with concrete types and generalizing only when multiple types genuinely share behavior. The skill helps compose constraints using references/CONSTRAINTS.md and defers interface-only patterns to go-interfaces.

Backend & APIsbackendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.