Pular para o conteúdo principal

victorstein.dev

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.