Группирование констант в языке Go

Какой предпочтительный (или правый) способ группировать большое количество связанных констант на языке Go? Например, С# и С++ имеют enum для этого.

Ответ 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"
)