Создайте перечисление из группы связанных констант в Go - PullRequest
17 голосов
/ 04 августа 2011

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

Ответы [ 4 ]

14 голосов
/ 04 августа 2011

const * * 1002

const (
    pi = 3.14
    foo = 42
    bar = "hello"
)
12 голосов
/ 04 августа 2011

Существует два варианта, в зависимости от того, как будут использоваться константы.

Первый - создать новый тип на основе int и объявить ваши константы, используя этот новый тип, например:

type MyFlag int

const (
    Foo MyFlag = 1
    Bar
)

Foo и Bar будут иметь тип MyFlag.Если вы хотите извлечь значение int обратно из MyFlag, вам нужен тип coersion:

var i int = int( Bar )

Если это неудобно, используйте предложение newacct о пустом константном блоке:

const (
    Foo = 1
    Bar = 2
)

Foo и Bar являются идеальными константами, которые можно назначить для int, float и т. Д.

Это описано в Effective Go в разделе Константы.См. Также обсуждение ключевого слова iota для автоматического назначения значений, таких как C / C ++.

5 голосов
/ 05 января 2018

Мой самый близкий подход к перечислениям - объявлять константы как типы. По крайней мере, у вас есть некоторая безопасность типов, которая является основным преимуществом типа enum.

type PoiType string

const (
    Camping            PoiType = "Camping"
    Eatery             PoiType = "Eatery"
    Viewpoint          PoiType = "Viewpoint"
)
2 голосов
/ 23 ноября 2015

Это зависит от того, чего вы хотите достичь с помощью этой группировки. Go позволяет группировать со следующим синтаксисом скобок:

const (
    c0 = 123
    c1 = 67.23
    c2 = "string"
)

Который просто добавляет хороший визуальный блок для программиста (редакторы позволяют его свернуть), но ничего не делает для компилятора (вы не можете указать имя для блока).

Единственное, что зависит от этого блока, это объявление константы йоты в Go (что довольно удобно для перечислений). Он позволяет легко создавать автоинкременты (гораздо больше, чем просто автоинкременты: подробнее об этом в ссылке).

Например, это:

const (
    c0 = 3 + 5 * iota
    c1
    c2
)

создаст константы c0 = 3 (3 + 5 * 0), c1 = 8 (3 + 5 * 1) и c2 = 13 (3 + 5 * 2).

...