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
-
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: função
func nome_funcao[T tipo_dado1 | tipo_dadoN]( <lista_parametros> T) T {
//...
}
Sintaxe: variável local
var nome_variavel T
Onde
T: indicador de uso de generics
tipo_dado1..N: tipo de dado aceito como argumento para T
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
Os tipos de dados utilizada com os parâmetros da função genérica devem suportar as operações
aplicados sobre eles. No exemplo acima, a operação de adição é suportada pelos tipos numéricos.
Porém, tipos complexos definidos pelo usuário não suportam esse operador.