Structs and Interfaces
Go Generics
Write one function or type that works with many types using type parameters.
What you'll learn
- Type parameters
- Constraints
- Generic types
Sum[T Number]
Sum([]int{1, 2, 3})6Sum([]float64{1.5, 2.5})4One definition, many types
Generics let you write code once and use it with different types. A type parameter such as T, written in square brackets, stands for a type that is chosen where the code is used.
Number is a constraint: Sum accepts any type built on int or float64. Map has two type parameters, so it can turn a slice of one type into a slice of another. Stack[T] is a generic type, and Stack[string] is a stack of strings.
Key points
- [T Number] limits T to numbers.
- any allows every type.
Stack[string]is a stack of strings.
Runnable Go example
main.go
package main
import (
"fmt"
"strings"
)
type Number interface {
~int | ~float64
}
func Sum[T Number](values []T) T {
var total T
for _, value := range values {
total += value
}
return total
}
func Map[T, U any](items []T, convert func(T) U) []U {
result := make([]U, 0, len(items))
for _, item := range items {
result = append(result, convert(item))
}
return result
}
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
}
func main() {
fmt.Println(Sum([]int{1, 2, 3}), Sum([]float64{1.5, 2.5}))
fmt.Println(Map([]int{1, 2, 3}, func(n int) string { return strings.Repeat("*", n) }))
stack := &Stack[string]{}
stack.Push("a")
stack.Push("b")
top, _ := stack.Pop()
fmt.Println(top, len(stack.items))
}
6 4
[* ** ***]
b 1Practice
Open the example in the online compiler, change a value or add a line, and predict the output before you run it. Then break the code on purpose and read the compiler's message.
Finished this lesson?
Mark it as learned to track your progress.
Your progress is saved in this browser Sign in to keep it on every device.
Practice with a challenge
Use what this lesson covers to solve a real problem. Each challenge runs in your browser with instant tests and an AI review.
All challenges