Como implementar enumerações (enums) de forma correta e idiomática em Go?
Olá a todos! Sou novo em Go, vim do Java e Python, e não consigo encontrar uma resposta clara para uma pergunta simples: como fazer enumerações (enums) em Go?
Em Java, estou acostumado a escrever:
```java
public enum Season {
WINTER, SPRING, SUMMER, AUTUMN
}
```
Em Python, uso `Enum` da biblioteca padrão. Já em Go, vejo apenas `const` e `iota`, mas isso não parece lógico — são apenas números, sem garantia de que alguém não passe o número 999 no lugar do meu "enum".
Preciso implementar um status de pedido:
- New
- Processing
- Shipped
- Delivered
- Cancelled
Gostaria que:
1. Houvesse tipagem estrita (não fosse possível passar um número arbitrário).
2. Fosse conveniente exibir o status como string para logs e para o usuário.
3. Houvesse a possibilidade de verificar se o valor está dentro do conjunto permitido.
Como isso é feito corretamente em Go? Ouvi falar sobre `iota`, mas não entendo como criar um enum completo com métodos. E também — por que Go não tem um enum nativo como outras linguagens? Isso é um bug ou uma feature?
Por favor, forneça