photo of a turtle swimming underwater

O que é e como utilizar o tipo enum

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!


Se inscreva na nossa newsletter

* indicates required

Um comentário sobre “O que é e como utilizar o tipo enum

  1. 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!

Deixe uma resposta