1

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

  1. 每个标识符的值是连续的,有一些间隙。(我相信 iota 和空白标识符在这方面有帮助)。
  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
)
4

3 回答 3

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。我还建议明确记录它的可比性。

于 2011-02-18T12:55:04.783 回答
5
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
)
于 2011-02-18T06:29:30.507 回答
0

这是 FUSE 操作码的 Go 代码。它是从枚举 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
)
于 2011-02-18T05:23:49.467 回答