Structs e interfaces

Go Generics

Write one function or type that works with many types using type parameters.

  • Intermediário
  • 5 min de leitura
  • 1 exemplo executável
O que você vai aprender
  • Type parameters
  • Constraints
  • Generic types
Sum[T Number]
Sum([]int{1, 2, 3})6
Sum([]float64{1.5, 2.5})4

One 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.

Pontos-chave

  1. [T Number] limits T to numbers.
  2. any allows every type.
  3. Stack[string] is a stack of strings.

Exemplo executável de Go

Go
Executar código →
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))
}
Gerar um botão Run para este exemplo Resultado da execução
6 4
[* ** ***]
b 1

Pratique

Abra o exemplo no compilador online, mude um valor ou adicione uma linha e tente prever a saída antes de executar. Depois quebre o código de propósito e leia a mensagem do compilador.

Terminou esta lição?

Marque como aprendida para acompanhar seu progresso.

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios