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