devfullcycle / imersao13

201 stars 78 forks source link

Lang: Enum não existe em GO #3

Closed rustnnes closed 11 months ago

rustnnes commented 1 year ago

Após o código estabelecido, tentei refatorar e esbarrei numa questão que não consigo pensar numa solução: limitar os valores que um campo pode receber, como no caso do campo Order.Status, que recebe OPEN e CLOSED, e Order.OrderType, que pode receber BUY e SELL.

Fiz algumas pesquisas, mas nenhum resultado deu uma ideia de como reforçar em tempo de desenvolvimento o valor que esses campos podem assumir.

Como vocês tem resolvido esse caso no dia-a-dia?

JoaoRafa19 commented 12 months ago

Então, realmente o Go não tem suporte a enum mas você pode usar uma redefinição de tipo

type OrderType string

const (
    Buy OrderType = "Buy"
    Sell OrderType = "Sell"
)

func (s OrderType) String() string {
    switch s {
    case Buy:
        return "Buy"
    case Sell:
        return "Sell"
    }
    return "unknown"
}

usando a redefinição voce usa as constantes Buy e Sell por exemplo e no caso do Status a estratégia é parecida e da até pra fazer algo mais parecido ainda, usando um mapeamento de inteiro pra string (uint8)

type OrderStatus uint8

const (
    open OrderStatus = iota
    closed
)

func (s OrderStatus) String() string {
    switch s {
    case open:
        return "open"
    case closed:
        return "close"
    }
    return "unknown"
}

E esse método String do tipo pode ser mapeado pro json, o iota define o primeiro como 0 e os próximos vão em ordem crescente de 1 em 1