5

定義した型の列挙型を生成しようとしています

type FeeStage int

これから、 iota を使用して、この型に基づいて列挙型を作成できることを学びました

const(
     Stage1 FeeStage = iota
     Stage2 
     Stage3
)

ただし、列挙型の実際の値を操作するのはかなり面倒で、エラーが発生しやすくなります。

const(
     Stage1 FeeStage = iota           // 0
     Stage2          = iota + 6       // 7
     Stage3          = (iota - 3) * 5 // -5
)

カスタム値を持つ ENUM のリストを特定の型に自動的に変換する方法はありますか。これは私が以前使用していたものですが、定数の最初のメンバーのみをカスタム型に変換します。

const(
     Stage1 FeeStage = 1
     Stage2          = 2
     Stage3          = 2
)

これは同様の結果の遊び場です

4

3 に答える 3

8

iota自動列挙型を使用するか、最も簡単なことを行う以外に方法はありません。

const(
     Stage1 FeeStage = 1
     Stage2 FeeStage = 2

     // or another syntax with same results
     Stage3 = FeeStage(2)
)

iota + 5私見は、あなたが言ったように本当に悪いことをするよりも面倒ではありません。

私は通常、プログラムのコンテキストを超えて値が重要でない場合は iota を使用し、プロトコルなどで値を使用する必要がある場合は明示的な型付けを使用します。

int または文字列を使用するだけで十分であると言わざるを得ない場合もありますが、それはコンテキストによって異なります。たとえば、標準ライブラリの http ステータス コードを参照してください。特別なタイプはありません。

于 2016-03-29T15:48:53.207 に答える
1

実は方法があります。しかし、最初にいくつかのことを明確にしましょう。

定数宣言では、型が存在する場合、定数は指定された型を取ります:

const n int64 = 3 // n will be a typed constant, its type will be int64

型が省略された場合、定数は式の型になります。

const x = int16(3) // x will be a typed constant, its type will be int16

式が型なし定数の場合、宣言された定数は型なし定数のままになります。

const i = 1 // i will be an untyped integer constant

iの型を出力しようとすると (たとえばfmt.Printf("%T", i)、 を使用すると、 が表示されることに注意してください。これはint、定数を関数に渡すとき、または変数に代入するときに、実際の型に変換する必要があり、デフォルトの型が使用されます (fmt.Println()引数の型が であるためinterface{}) - これはint型なし整数定数用です。

括弧で囲まれたconst宣言リスト内では、式リストを宣言から省略できます (最初の部分を除く)。式が欠落している場合は、前の空でない式が使用されます (テキスト置換)。

したがって、これを行うと:

const(
    Stage1 FeeStage = iota
    Stage2 
    Stage3
)

その意味は:

const (
    Stage1 FeeStage = iota
    Stage2 FeeStage = iota
    Stage3 FeeStage = iota
)

その結果、Stage1Stage2およびの 3 つの新しい定数が生成Stage3され、すべてタイプが になりFreeStageます。

2番目の例:

const (
    Stage1 FeeStage = iota           // 0
    Stage2          = iota + 6       // 7
    Stage3          = (iota - 3) * 5 // -5
)

式を省略しなかったため、最初の定数のみStage1が ( type の) 型付き定数になりFreeStage、残りは型なし定数になります! したがって、これは資格さえありません(要件に準拠していません)!

そして今、あなたのポイントに:あなたはこのようなものが欲しいです:

const(
    Stage1 FeeStage = 1
    Stage2          = 2
    Stage3          = 2
)

上記のように、型を省略した場合、型なし定数Stage2となります。Stage3そのため、型を指定する必要があります。const 仕様が次のようになっているという事実を利用できます。

ConstSpec      = IdentifierList [ [ Type ] "=" ExpressionList ] .

識別子リストを指定できます:

const(
    Stage1, Stage2, Stage3 FeeStage = 1, 2, 2
)

これはより読みやすいですか?たぶん、いくつかの定数だけがある場合。多数ある場合は、Not_a_Golfer の推奨事項を使用してください。

const(
    Stage1 FeeStage = 1
    Stage2 FeeStage = 2
    Stage3 FeeStage = 2
)
于 2016-03-29T18:02:43.620 に答える