Muitas vezes, dentro dos sistemas que desenvolvemos, temos valores constantes. Dentre outras possibilidades, um exemplo desses valores, seria a representação do status de um cadastro. Nesse caso, pense em um status onde temos variações além de ativo e inativo.
Caso esses status sejam definidos como string, sua validação dentro do sistema pode acabar se tornando uma grande dor de cabeça. Além, é claro, de “inflar” o binário. Afinal, em cada validação teremos 2 strings (valor esperado e valor sendo validado).
Na tentativa de evitar esses problemas, podemos utilizar o famoso tipo enum. Se você não está familiarizado com esse tipo, ele nada mais é do que um tipo de tamanho limitado ou fixo.
Para ficar mais claro, vamos escrever um pouco de código. Seguindo a ideia apresentada no inicio do post, vamos criar um tipo enum para validar status de um cadastro.
Definindo um novo tipo
Criar um enum baseado nos tipos padrões do Go pode ser um problema. Quer ver?! Imagine que tenhamos definido nosso enum de status como sendo do tipo uint8. Imagine também que nosso sistema já tinha outro enum do tipo uint8 para gênero.
Agora, imagine que o valor 1 representa tanto o status Pending, como gênero Sertanejo. O que vai acontecer se a validação if Pending == Sertanejo
for feita? Exato, ele vai retornar true.
Para que isso não aconteça, vamos criar um novo tipo para lidar com os enums de status. Esse tipo será baseado no tipo uint8. Porém, por ser um tipo diferente, a validação citada anteriormente não retornará true.
type Status uint8
Criando ENUM
Com um novo tipo definido, vamos criar as constantes com seus valores para os status do cadastro.
const ( Created Status = 0 Pending = 1 Approved = 2 Rejected = 3 )
Embora não esteja errado atribuir os valores da forma que fizemos acima, existe uma forma bem mais simples. Ao invés de atribuir um valor em cada uma das constantes, podemos utilizar a keyword iota. Essa keyword faz com que o Go atribua o valor 0 à primeira constante e, de forma sequencial, vá incrementando em 1 o valor atribuído a cada constante.
const ( Created Status = iota Pending Approved Rejected )
Print do ENUM
Da forma como temos o enum implementado até o momento, ao printar a constante Created, o valor 0 será exibido. No entanto, para facilitar a leitura, é muito mais interessante que, ao invés do valor 0, a palavra Created seja exibida.
Resolver isso é tão simples quanto implementar um método. Afinal, essa é a solução.
Vamos implementar o método mágico String()
.
func (s Status) String() string { switch s { case Created: return "created" case Pending: return "pending" case Approved: return "approved" case Rejected: return "rejected" } return "unknown" }
Conclusão
Para testar, vamos fazer um print simples do status Pending.
package main import "fmt" type Status uint8 const ( Created Status = iota Pending Approved Rejected ) func (s Status) String() string { switch s { case Created: return "created" case Pending: return "pending" case Approved: return "approved" case Rejected: return "rejected" } return "unknown" } func main() { fmt.Println(Pending) }
Ao fazer go run
, a saída deverá ser pending
.
É isso. Espero que tenha sido útil para você.
Até a próxima!
Cara eu só queria agradecer a tudo o que você faz, e o quanto você já conseguiu me ensinar da linguagem GO, ontem mesmo dia 13/03 tive uma aula de Programação orientado a objetos, e ele explicou o conceito de enum, uma aula inteira falando sobre, e eu aprendi muito mais rápido por aqui, e é isso, muito obrigado e continue com o ótimo trabalho que você tem feito!