键入的常量声明列表

Mat*_*ner 1 enums constants go iota

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

  1. 每个标识符的值是顺序的,有一些间隙.(我相信iota和空白标识符在这方面有帮助).
  2. 标识符对模块是私有的.
  3. 常量只能与相同类型的其他常量进行比较.

枚举是基于enum fuse_opcodeFUSE.这是我正在尝试完成的一些代码(也是非常错误的):

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

rog*_*rog 22

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

type opCode int

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

如果你真的想要防止外部软件包看到这些是整数常量的事实,但你仍然希望它具有可比性,你可以考虑做这样的事情,

type OpCode struct {
    code opCode
}
Run Code Online (Sandbox Code Playgroud)

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


Jes*_*sta 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
)
Run Code Online (Sandbox Code Playgroud)

  • 你为什么不使用“iota”?为什么是“int32”? (2认同)