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!