Go Generics Cheat Sheet
Explains Go's generic type parameters, type constraints, the built-in constraints package, and how to write reusable generic functions and data structures.
2 PagesIntermediateMar 28, 2026
Generic Functions
Declaring a function with a type parameter.
go
// T is constrained to types supporting comparison operatorsfunc Max[T int | float64 | string](a, b T) T { if a > b { return a } return b}func main() { fmt.Println(Max(3, 7)) // 7 (T inferred as int) fmt.Println(Max(2.5, 1.1)) // 2.5 (T inferred as float64) fmt.Println(Max("go", "rust")) // "rust"}
Custom Type Constraints
Defining reusable constraint interfaces.
go
type Number interface { ~int | ~int32 | ~int64 | ~float32 | ~float64}// ~int allows any type whose underlying type is int (e.g. type MyInt int)func Sum[T Number](nums []T) T { var total T for _, n := range nums { total += n } return total}// comparable permits == and !=func Contains[T comparable](s []T, target T) bool { for _, v := range s { if v == target { return true } } return false}
Constraint Keywords
Syntax used when writing type constraints.
- any- Alias for interface{}; permits any type, no operations besides assignment
- comparable- Built-in constraint allowing == and !=; required for map keys
- ~T (tilde)- Matches T and any type whose underlying type is T (approximation element)
- | (union)- Combines multiple types/terms into one constraint, e.g. int | float64
- constraints.Ordered- From golang.org/x/exp/constraints; types supporting <, <=, >, >=
- type set- A constraint interface defines the set of permitted types, not just methods
Generic Types
A generic stack implementation using a type parameter.
go
type Stack[T any] struct { items []T}func (s *Stack[T]) Push(item T) { s.items = append(s.items, item)}func (s *Stack[T]) Pop() (T, bool) { var zero T if len(s.items) == 0 { return zero, false } last := s.items[len(s.items)-1] s.items = s.items[:len(s.items)-1] return last, true}s := Stack[int]{}s.Push(1)s.Push(2)v, ok := s.Pop() // v == 2, ok == true
Built-in Generic Helpers
Generic functions available in modern Go without extra imports.
- min(a, b)- Built-in generic function (Go 1.21+) returning the smaller of two ordered values
- max(a, b)- Built-in generic function (Go 1.21+) returning the larger of two ordered values
- clear(m)- Built-in generic function that empties a map or zeroes a slice's elements
- slices.Sort(s)- Sorts a slice of any ordered type in place, from the slices package
- slices.Contains(s, v)- Reports whether v is present in slice s
- maps.Keys(m)- Returns an iterator over a map's keys, from the maps package
Pro Tip
Prefer defining the narrowest constraint you need (e.g. a custom Number interface) instead of `any` — it keeps compile-time type checking useful and avoids reflection-like escape hatches.
Was this cheat sheet helpful?
Explore Topics
#GoGenerics#GoGenericsCheatSheet#Programming#Intermediate#GenericFunctions#CustomTypeConstraints#ConstraintKeywords#GenericTypes#Functions#CheatSheet#SkillVeris