ГОЛАНГ "Именованные" перечисления?

Я понимаю, что идиоматический способ создания перечисления в GO выглядит следующим образом:

type topicStatus int

const (
  registered topicStatus = iota
  active
  inactive
  pending-removal
  removed
 )

но если у меня есть другое "перечисление", которое хочет "повторно использовать" имя, я получаю сообщение об ошибке:

type hotelVisit int

const (
   registered hotelVisit = iota
   checked-in
   checked-out
)

Здесь, если я попробую это, я не могу различать темуStatus.registered и hotelVisit.registered, поскольку ранее был зарегистрирован "зарегистрированный" - есть ли способ "namespace" имен "enum"?

Ответ 1

Создайте новый пакет для каждого из перечислений, которые вы хотите определить. Это означает создание подкаталога с файлом go, который имеет "package topicStatus" с внутренним определением const (имя подкаталога совпадает с именем пакета).  Помните, что все определенные константы должны быть в верхнем регистре, чтобы они были экспортируемыми. Сделайте то же самое для "hotelVisit" и все, что вам нужно. Ваша программа будет импортировать эти пакеты, а затем использовать их по мере необходимости: hotelVisit.Registered, topicStatus.Registered.

Ответ 2

Загрязнение пространства имен многочисленными идентификаторами нижнего регистра с обычным словом, которые могут вызвать конфликты именования, не является чем-то, что я считаю идиоматическим Go. То же самое касается создания пакетов только для хранения нескольких постоянных объявлений.

Я бы, наверное, сделал что-то вроде этого:

type topicStatus int

const (
    tsRegistered topicStatus = iota
    tsActive
    tsInactive
    tsPendingRemoval
    tsRemoved
)

type hotelVisit int

const (
    hvRegistered hotelVisit = iota
    hvCheckedIn
    hvCheckedOut
)

Теперь вы можете объявить и инициализировать с помощью ts := tsPendingRemoval. Ясный и лаконичный с небольшим риском именования конфликтов.

Ответ 3

Одним из обходных путей является использование анонимной структуры для определения пространства имен.

    type TopicStatusType int
    const (
       registered topicStatus = iota
       active
       ...
    )
    var TopicStatus = struct{
        Registered TopicStatusType
        Active TopicStatusType
        ...
    }{
        Registered: registered,
        Active: active,
        ...
    }