2011-02-18 128 views
1

我希望创建常量的“枚举喜欢”清单具有以下属性:类型化常数声明列表

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

该枚举是基于从FUSEenum fuse_opcode。以下是我正在尝试完成的一些代码(以及非常错误的代码):

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

回答

0

下面是FUSE操作码的Go代码。它创建于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 
) 
+3

答案很糟糕,但没错。 –

+0

请给出一个理由,为什么明确的值是最好的upvote。尝试所有选项后,此方法看起来最干净和最简单。 –

+2

为什么要创建一个opCode类型? Go如何知道opLookup是一个值为1的opCode而不是一个纯int? – weberc2

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 
) 
+0

这个额外的图层是如何工作的? –

+0

@Jessta:额外的间接层不强制编译器中的任何东西。 –

+0

是的:http://golang.org/doc/go_spec.html#Constant_declarations –

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 
} 

,只露出OpCode在你的API中。我还建议明确记录它的可比性。

+0

使opCode成为一个结构意味着你不能使用上面的const技巧,或者很容易地使用switch语句等等+1来保持opCode为int。让一个数字成为一个数字。 –

+0

是的,这不起作用,对不起。 –

+0

@RossLight号码经常带有不同的语义含义,让系统防止您混淆他们通常很有帮助。例如,添加DegreesC和BananaID并没有多大意义。 – weberc2