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
)
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 コードを次に示します。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
)
于 2011-02-18T05:23:49.467 に答える