2011-02-18 78 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