O que é e como usar a nova constraint comparable

Desde a versão 1.18 do Golang, uma nova constraint está disponível para nos ajudar no dia a dia de trabalho.

Nesse post vamos explorar essa constraint para entender o que ela é e onde podemos utiliza-lá.

De forma bem simples, a constraint comparable é uma interface para todos os tipos onde podemos utilizar == ou != para compará-los, ou seja, podemos utilizá-la para ints, floats, booleans, strings, ponteiros, channels, structs onde todos os campos são comparáveis e arrays de tipos comparáveis.

Abaixo você pode ver um pequeno exemplo de sua utilização em uma função com generics.

func Equals[T comparable](a, b T) bool {
    return a == b
}

type Pessoa struct {
    Name string
}

func main() {
    fmt.Println(Equals("a", "b"))
    fmt.Println(Equals(1, 1))
    fmt.Println(Equals(true, true))
    fmt.Println(Equals(Pessoa{"Tiago"}, Pessoa{"Tiago"}))
}

// SAÍDA
false
true
true
true

Um detalhe importante sobre essa constraint, é que ela só pode ser usada como um parâmetro na definição de uma função ou struct que utilize generics.

Em outras palavras, ou melhor, mostrando em código, no exemplo abaixo a utilização da constraint irá gerar um erro do tipo “interface is (or embeds) comparable” ao tentar compilar.

func Equals(a, b comparable) bool {
    return a == b
}

type Data struct {
    Key   string
    Value comparable
}

Para que possamos utilizar ela no exemplo acima, precisamos fazer a seguinte mudança.

func Equals[T comparable](a, b T) bool {
    return a == b
}

type Data[T comparable] struct {
    Key   string
    Value T
}

Deixem suas dúvidas nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Deixe uma resposta