Ícone do site Aprenda Golang

O que é e como utilizar o tipo enum

photo of a turtle swimming underwater

Photo by Belle Co on Pexels.com

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.

Se você quer saber um pouco mais sobre ENUMs em Go, veja o novo post: Melhores práticas na utilização de ENUMs.

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.

Livros Recomendados

Abaixo listei alguns dos melhores livros que já li sobre GO.

Sair da versão mobile