Generics allow writing type-safe functions and data structures that work across multiple types without code duplication or runtime reflection, but should complement rather than replace interfaces.
Generic collections: typed stacks, queues, sets, linked lists
Functional utilities: Map, Filter, Reduce, Contains, Keys, Values
Typed repository or service interfaces to avoid repeated boilerplate
Type-safe event bus or pub/sub systems
Constraint-based numeric or ordered operations
Runtime polymorphism with interfaces is sufficient and clearer
The type set is open-ended — new types should satisfy behavior via interfaces, not constraints
Constraints become so complex they hurt readability more than they help
You need method type parameters — Go does not support them, only function and type-level generics