ГОЛАНГ "Именованные" перечисления?
Я понимаю, что идиоматический способ создания перечисления в 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,
...
}