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!
Faça parte da comunidade!
Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.

