13/100 Dias de Golang - Generics
Table of Contents
#
Generics
Seguindo com nosso exemplo do pacote utils
, vamos analisar nossa função Soma
func Soma(a, b int) int {
return a + b
}
Essa função Soma
possui uma lógica muit simples, ele recebe dois inteiros e retorna um inteiro. Agora, imagine que queremos somar dois floats, teríamos que criar outra função SomaFloat
que aceita dois floats e retorna um float.
func SomaFloat(a, b float64) float64 {
return a + b
}
Essa função SomaFloat
é praticamente igual a função Soma
, a única diferença é que ela aceita dois floats e retorna um float. Aí agora tenho que fazer isso para todos os tipos de dados que eu quero somar e repetir para todas as operações matemáticas. Parece meio contra produtivo, não é mesmo? Antes da versão 1.18 do Go, resolveríaamos esse problema com interfaces, mas agora temos Generics! Veja como podemos resolver esse problema com Generics:
type Number interface {
int | float64
}
func Soma[T Number](a, b T) T {
return a + b
}
Veja a sintaxe do Generics, declaramos um tipo Number
que é uma interface que aceita int
ou float64
. Depois, declaramos a função Soma
com um tipo genérico T
que implementa a interface Number
.
Agora, podemos chamar a função Soma
com qualquer tipo que implementa a interface Number
.
fmt.Println(Soma(10, 5)) // 15
fmt.Println(Soma(10.5, 5.5)) // 16
Generics trouxeram um grande avanço para o Go, permitindo mais flexibilidade e reutilização de código sem comprometer a segurança de tipo. No entanto, devem ser usados com moderação para evitar complexidade excessiva. Como sempre, a filosofia do Go de simplicidade e clareza continua sendo um guia essencial para adoção de novas features. Mais posts virão sobre Generics, ainda estou estudando essa feature e quero compartilhar com vocês.