Типизированный список объявлений констант - PullRequest
1 голос
/ 18 февраля 2011

Я хочу создать список констант типа enum со следующими свойствами:

  1. Значения каждого идентификатора являются последовательными, с несколькими пробелами. (Я думаю, что йота и пустой идентификатор помогают в этом отношении).
  2. Идентификаторы являются частными для модуля.
  3. Константы можно сравнивать только с другими константами того же типа.

Перечисление основано на enum fuse_opcode из FUSE . Вот некоторый код для того, что я пытаюсь выполнить (и тоже очень неправильно):

const Opcode (
    _ = iota // skip 0
    lookupOp
    forgetOp
    getattrOp
    setattrOp
    readlinkOp
    symlinkOp // 6
    _ // skip 7
    mknodOp // 8
    // et cetera ad nauseam
)

Ответы [ 3 ]

22 голосов
/ 18 февраля 2011

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

type opCode int

const (
    lookupOp opCode = iota+1
    forgetOp
    getattrOp
    setattrOp
    readlinkOp
    symlinkOp // 6
    _         // skip 7
    mknodOp   // 8
    // et cetera ad nauseam
)

Если вы действительно хотите запретить внешние пакетыУчитывая тот факт, что это целочисленные константы, но вы все равно хотите, чтобы они были сопоставимы, вы можете подумать о том, чтобы сделать что-то вроде этого,

type OpCode struct {
    code opCode
}

и только выставить OpCode в своем API.Я также предложил бы явно документировать, что это сопоставимо.

3 голосов
/ 18 февраля 2011
package fuse

type opCode int32

const (
    opLookup  opCode    = 1
    opForget  opCode    = 2
    opGetattr opCode    = 3
    opSetattr  opCode   = 4
    opReadlink opCode   = 5
    opSymlink  opCode   = 6
    opMknod   opCode    = 8
    opMkdir   opCode    = 9
    opUnlink   opCode   = 10
)
0 голосов
/ 18 февраля 2011

Вот код Go для кодов операций FUSE.Он был создан из enum fuse_opcode .Обычно вы пишете скрипт для этого;Я использовал текстовый редактор.Поскольку значения констант соответствуют значениям перечисления C, используются явные значения.

package fuse

type opCode int32

const (
    opLookup      = 1
    opForget      = 2
    opGetattr     = 3
    opSetattr     = 4
    opReadlink    = 5
    opSymlink     = 6
    opMknod       = 8
    opMkdir       = 9
    opUnlink      = 10
    opRmdir       = 11
    opRename      = 12
    opLink        = 13
    opOpen        = 14
    opRead        = 15
    opWrite       = 16
    opStatfs      = 17
    opRelease     = 18
    opFsync       = 20
    opSetxattr    = 21
    opGetxattr    = 22
    opListxattr   = 23
    opRemovexattr = 24
    opFlush       = 25
    opInit        = 26
    opOpendir     = 27
    opReaddir     = 28
    opReleasedir  = 29
    opFsyncdir    = 30
    opGetlk       = 31
    opSetlk       = 32
    opSetlkw      = 33
    opAccess      = 34
    opCreate      = 35
    opInterrupt   = 36
    opBmap        = 37
    opDestroy     = 38
    opIoctl       = 39
    opPoll        = 40
    opNotifyReply = 41
)
...