Generics é um conceito utilizado em linguagens O.O em que podemos definir classes, métodos e interfaces que aceitam tipos de dados como argumento. Assim, não precisamos escrever código para cada tipo de dado.

No exemplo abaixo, sem utilizar generics, temos que declarar duas funções de adição para os tipos de dados int e float.

Exemplo 1
package main

import (
	"fmt"
)
//sem generics
func addInt(a int, b int) int {
	return a + b
}
//sem generics
func addFloat(a float32, b float32) float32 {
	return a + b
}

func main() {

	fmt.Println(addInt(1, 1))
	fmt.Println(addFloat(1.4, 1.5))
}
Saída
2
2.9

Como pode ser observado, duas funções foram codificadas para atender a adição de dois valores inteiros e floats. Como consequência, foi necessário a repetição de código do retorno em ambas as funções, por exemplo.

Fazendo uso de generics, codificamos apenas um função com os possíveis tipos de dados aceitos por uma função:

Sintaxe
func nome_funcao[T tipo_dado1 | tipo_dadoN](parametros T) T {
 //corpo
  var nome_variavel T //variavel local
}
Onde
T: indicador de uso de generics
tipo_dado: tipo de dado aceito como argumento
Exemplo 2
package main

import (
	"fmt"
)

//com generics
func add[T int | float32 | float64](a T, b T) T {
	return a + b
}

func main() {

	fmt.Println(add(1, 1))
	fmt.Println(add(1.4, 1.5))
}
Saída
2
2.9

O mesmo conceito pode ser aplicado a coleções e tipos derivados com map, array e outros. Abaixo um exemplo de somatório de valores contidos em arrays de int ou float.

Exemplo 3
package main
import "fmt"

func soma[T int | float32](array []T) T {
	var total T
	for _, val := range array {
		total += val
	}
	return total
}

func main() {

	arrayInt := []int{1, 1}
	arrayFloat := []float32{1.4, 1.5}
	fmt.Println(soma(arrayInt))
	fmt.Println(soma(arrayFloat))
}
Saída
2
2.9

Fazendo uso de interface, podemos declarar uma interface que "agrupa" todos os tipos aceitos, simplificando a declaração da função:

Exemplo 4
package main

import "fmt"

type Tipos interface {
	int | float32 | float64
}

func add[T Tipos](a T, b T) T {
	return a + b
}

func main() {

	fmt.Println(add(1, 1))
	fmt.Println(add(1.4, 1.5))
}
Saída
2
2.9
  1. 14/05/2025 - versão inicial