Какой предпочтительный (или правый) способ группировать большое количество связанных констант на языке Go? Например, С# и С++ имеют enum
для этого.
Группирование констант в языке Go
Ответ 1
const
?
const (
pi = 3.14
foo = 42
bar = "hello"
)
Ответ 2
В зависимости от того, как будут использоваться константы, существует два варианта.
Во-первых, нужно создать новый тип на основе int и объявить ваши константы с использованием этого нового типа, например:
type MyFlag int
const (
Foo MyFlag = 1
Bar
)
Foo
и Bar
будет иметь тип MyFlag
. Если вы хотите извлечь значение int из MyFlag
, вам понадобится тип слияния:
var i int = int( Bar )
Если это неудобно, используйте newacct-предложение открытого const-блока:
const (
Foo = 1
Bar = 2
)
Foo
и Bar
- идеальные константы, которые могут быть назначены для int, float и т.д.
Это описано в Эффективный ход в разделе "Константы". См. Также обсуждение ключевого слова iota
для автоматического назначения значений, таких как C/С++.
Ответ 3
Это зависит от того, чего вы хотите достичь этой группировкой. Go позволяет группировать следующие синтаксисы:
const (
c0 = 123
c1 = 67.23
c2 = "string"
)
Что только добавляет хороший визуальный блок для программиста (редакторы позволяют его свернуть), но ничего не делает для компилятора (вы не можете указать имя для блока).
Единственное, что зависит от этого блока, - это объявление константы iota в Go (что довольно удобно для перечислений). Он позволяет легко создавать автоматические приращения (путь больше, чем просто автоматическое увеличение: больше по этому поводу в ссылке).
Например:
const (
c0 = 3 + 5 * iota
c1
c2
)
создаст константы c0 = 3
(3 + 5 * 0), c1 = 8
(3 + 5 * 1) и c2 = 13
(3 + 5 * 2).
Ответ 4
Мой самый близкий подход к перечислениям заключается в объявлении констант как типа. По крайней мере, у вас есть тип безопасности, который является основным перком типа перечисления.
type PoiType string
const (
Camping PoiType = "Camping"
Eatery PoiType = "Eatery"
Viewpoint PoiType = "Viewpoint"
)