我希望创建一个具有以下属性的“类似枚举”的常量列表:
枚举基于enum fuse_opcode
的FUSE。这里有一些我想要完成的代码(也是非常错误的):
const Opcode (
_ = iota // skip 0
lookupOp
forgetOp
getattrOp
setattrOp
readlinkOp
symlinkOp // 6
_ // skip 7
mknodOp // 8
// et cetera ad nauseam
)
答案 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
)