键入的常量声明列表

时间:2011-02-18 04:27:54

标签: enums constants go iota

我希望创建一个具有以下属性的“类似枚举”的常量列表:

  1. 每个标识符的值是连续的,有一些间隙。 (我相信iota和空白标识符在这方面有所帮助)。
  2. 标识符对模块是私有的。
  3. 常量只能与相同类型的其他常量进行比较。
  4. 枚举基于enum fuse_opcodeFUSE。这里有一些我想要完成的代码(也是非常错误的):

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

3 个答案:

答案 0 :(得分:22)

你想要这样的东西。您仍然可以将这些常量与文字整数进行比较(没有办法防止这种情况),但是对其他整数值的任何比较或赋值都会产生编译错误。

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
}

并且只在您的API中公开OpCode。我还建议明确记录它是可比较的。

答案 1 :(得分:3)

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
)

答案 2 :(得分:0)

这是FUSE操作码的Go代码。它是从enum fuse_opcode创建的。通常你会编写一个脚本来做到这一点;我用了一个文本编辑器。由于常量值与C enum值匹配,因此使用显式值。

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
)